Bash скрипт всегда печатает "Команда не найдена"
Каждый раз, когда я запускаю скрипт, используя bash scriptname.sh
из командной строки в Debian я получаю Command Not found
а затем результат сценария. Так что скрипт работает, но всегда есть Command Not Found
заявление напечатано на экране.
Я запускаю скрипт из /var
папка.
Вот сценарий:
#!/bin/bash
echo Hello World
Я запускаю его, набрав следующее:
bash testscript.sh
ОБНОВЛЕНИЕ - проблема появляется в пустых строках. Каждая пустая строка приводит к тому, что команда не найдена. Почему это произошло?
17 ответов
Убедитесь, что ваша первая строка:
#!/bin/bash
Введите свой путь к Bash, если это не так /bin/bash
Попробуйте запустить:
dos2unix script.sh
Это преобразует окончания строк и т. Д. Из Windows в формат Unix. то есть он удаляет \r (CR) из концов строк, чтобы изменить их \r\n (CR+LF)
в \n (LF)
,
Подробнее о dos2unix
команда (справочная страница)
Другой способ узнать, находится ли ваш файл в формате dos/Win:
cat scriptname.sh | sed 's/\r/<CR>/'
Вывод будет выглядеть примерно так:
#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>
Это выведет весь текст файла с <CR>
отображается для каждого \r
символ в файле.
Я также столкнулся с аналогичной проблемой. Проблема, кажется, разрешения. Если вы делаете ls -l
вы можете определить, что в вашем файле НЕ установлен бит выполнения. Это НЕ позволит выполнить скрипт.:)
Как @artooro добавил в комментарии:
Чтобы исправить эту проблему, запустите
chmod +x testscript.sh
Это может быть тривиально и не связано с вопросом ОП, но я часто ошибался в начале, когда изучал скриптинг
VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"
Это даст ответ "команда не найдена". Правильный путь заключается в устранении пробелов
VAR_NAME=$(hostname)
На Bash для Windows я попытался неправильно запустить
run_me.sh
без./ в начале и получил ту же ошибку.
Для людей с фоном Windows правильная форма выглядит излишней:
./run_me.sh
Если скрипт выполняет свою работу (относительно) хорошо, значит, он работает нормально. Ваша проблема, вероятно, в одной строке файла, ссылающейся на программу, которая либо не находится в пути, не установлена, не написана с ошибкой или чем-то подобным.
Одним из способов является размещение set -x
в верхней части вашего скрипта или запустить его с bash -x
вместо просто bash
- это выведет строки перед их выполнением, и вам обычно нужно просто посмотреть на вывод команды непосредственно перед ошибкой, чтобы увидеть причину проблемы
Если, как вы говорите, проблемы возникают из-за пустых строк, вы можете проверить, что в них есть. Бежать:
od -xcb testscript.sh
и убедитесь, что нет "невидимых" забавных персонажей, таких как CTRL-M
(возврат каретки) вы можете получить с помощью редактора типа Windows.
Для выполнения этого вы должны предоставить полный путь, например,
/home/Manuel/mywrittenscript
Пытаться chmod u+x testscript.sh
Я знаю это отсюда: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
Если у вас есть Notepad++ и вы получаете это сообщение об ошибке.sh: "команда не найдена" или это сообщение об ошибке autoconf "строка 615: ../../autoconf/bin/autom4te: такого файла или каталога нет".
На вашем Notepad++, перейдите в Edit -> EOL Conversion, затем проверьте Macinthos (CR). Это отредактирует ваши файлы. Я также рекомендую проверять все файлы с помощью этой команды, потому что вскоре такая ошибка произойдет.
Была такая же проблема. к несчастью
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
(обратите внимание, что дополнительный пробел после "\") вызовет проблемы, но когда вы удалите этот пробел, он будет работать отлично.
Убедитесь, что вы не переопределили переменную PATH по ошибке следующим образом:
#!/bin/bash
PATH="/home/user/Pictures/"; # do NOT do this
Это была моя ошибка.
Я также имел некоторые из Cannot execute command
, Все выглядело правильно, но на самом деле у меня было неразрывное пространство
прямо перед моим командованием, которое было невозможно разглядеть невооруженным глазом:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
Который в Vim выглядел так:
if [[ "true" ]]; then
highlight --syntax js "var i = 0;"
fi
Только после запуска проверки скриптов Bash shellcheck
я нашел проблему.
Я столкнулся с этим сегодня, рассеянно копируя командную строку доллара $
(перед строкой команды) в сценарий.
Возможно, вы захотите обновить файлы.bashrc и.bash_profile псевдонимами, чтобы распознавать вводимую вами команду.
Файлы.bashrc и.bash_profile - это скрытые файлы, которые, вероятно, находятся на вашем диске C:, где вы сохраняете свои программные файлы.
Добавьте текущий каталог ( .) В PATH, чтобы иметь возможность выполнить скрипт, просто введя его имя, которое находится в текущем каталоге:
PATH=.:$PATH