Скрипт Bash всегда печатает " команда не найдена"

каждый раз, когда я запускаю скрипт с помощью bash scriptname.sh из командной строки в Debian, я получаю Command Not found и затем результат сценария. Таким образом, скрипт работает, но всегда есть Command Not Found заявление печатается на экране.

я запускаю скрипт из /var папка.

вот этот скрипт:

#!/bin/bash

echo Hello World

я запускаю его, набрав следующее:

bash testscript.sh

UPDATE-проблема появляется в пустых строках. Каждая пустая строка приводит к команда не найдена. Почему это произошло?

16 ответов


убедитесь, что первая строка:

#!/bin/bash

введите путь к bash, если это не /bin/bash


попробуй:

dos2unix script.sh

это Wil конвертировать окончания строк и т. д. Из Windows в формат unix. т. е. он удаляет \r (CR) из окончаний строк, чтобы изменить их с \r\n (CR+LF) to \n (LF).

подробнее о dos2unix команда (man-страница)


другой способ узнать, находится ли ваш файл в dos/Win формат:

cat scriptname.sh | sed 's/\r/<CR>/'

результат будет выглядеть примерно так:

#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>

это выведет весь текст файла с <CR> отображается для каждого \r символ в файл.


можно использовать bash -x scriptname.sh проследить.


Я также столкнулся с аналогичной проблемой. Проблема, похоже, в разрешениях. Если вы сделаете ls -l, вы можете определить, что ваш файл может не иметь бит выполнения включен. Это не позволит выполнить сценарий. :)

Как @artooro добавил в комментарий:

чтобы исправить эту проблему, запустите chmod +x testscript.sh


если скрипт выполняет свою работу (относительно) хорошо, тогда он работает нормально. Ваша проблема, вероятно, одна строка в файле, ссылающаяся на программу, которая либо не находится на пути, не установлена, с ошибкой или что-то подобное.

один из способов-это поставить set -x в верхней части скрипта или запустите его с помощью bash -x вместо bash - это выход на линии перед их выполнением и, как правило, просто нужно посмотреть на вывод команды непосредственно перед ошибкой, чтобы увидеть что вызывает проблему

если, как вы говорите, это пустые строки, вызывающие проблемы, вы можете проверить, что actaully на них. Беги:

od -xcb testscript.sh

и убедитесь, что нет" невидимых " смешных персонажей, таких как CTRL-M (возврат каретки) вы можете получить с помощью редактора типа Windows.


использовать dos2unix в файле сценария.


Если у вас есть Notepad++, и вы получите это .SH сообщение об ошибке:"команда не найдена" или это сообщение об ошибке autoconf " строка 615: ../../ autoconf / bin / autom4te:нет такого файла или каталога".

в блокноте++ перейдите в редактировать ->преобразование EOL затем проверить Macinthos (CR). Это изменит ваши файлы. Я также рекомендую проверить все файлы с помощью этой команды, потому что скоро такая ошибка произойдет.


попробовать chmod u+x testscript.sh

Я знаю это отсюда: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/


для выполнения этого необходимо указать полный путь например

/home/Manuel/mywrittenscript

была такая же проблема. К сожалению

dos2unix winfile.sh
bash: dos2unix: command not found

Так что я сделал это, чтобы преобразовать.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

а то

bash unixfile.sh

проблемы с запуском скриптов также могут быть связаны с плохим форматированием многострочных команд, например, если у вас есть пробел после разрыва строки "\". Е. Г. это:

./run_me.sh \ 
--with-some parameter

(обратите внимание, что дополнительное пространство после"\") вызовет проблемы, но когда вы удалите это пространство, оно будет работать отлично.


Это может быть тривиально и не связано с вопросом OP, но я часто ошибался в начале, когда я изучал сценарии

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

это вызовет ответ "команда не найдена". Правильный способ-устранить пробелы

VAR_NAME=$(hostname)

я тоже не из Cannot execute command. Все выглядело правильно, но на самом деле у меня был неразрывный пробел &nbsp; прямо перед моей командой, которую, конечно, невозможно было заметить невооруженным глазом:

if [[ "true" ]]; then
  &nbsp;highlight --syntax js "var i = 0;"
fi

, который, в Vim, выглядел так:

if [[ "true" ]]; then
  highlight --syntax js "var i = 0;"
fi

только после запуска bash script checker shellcheck Я нашел проблему.


добавить текущий каталог ( . ) путь, чтобы иметь возможность выполнить скрипт, просто введя его имя, которое находится в текущем каталоге:

PATH=.:$PATH

я столкнулся с этим сегодня, рассеянно копируя командную строку доллара $ (перед командной строкой) в скрипт.


на Bash для Windows я попытался неправильно запустить

run_me.sh 

без ./ в начале и получил ту же ошибку.

для людей с фоном Windows правильная форма выглядит избыточной:

./run_me.sh

вы можете обновить вас .bashrc и и .файлы bash_profile с псевдонимами для распознавания вводимой команды.

.bashrc и и .файлы bash_profile-это скрытые файлы, вероятно, расположенные на вашем диске C:, где вы сохраняете свои программные файлы.