Скрипт Bash всегда печатает " команда не найдена"
каждый раз, когда я запускаю скрипт с помощью bash scriptname.sh из командной строки в Debian, я получаю Command Not found а потом результат работы скрипта. Так что скрипт работает, но всегда есть Command Not Found заявление печатается на экране.
я запускаю скрипт из /var папка.
вот скрипт:
#!/bin/bash
echo Hello World
я запускаю его, набрав следующее:
bash testscript.sh
обновление-проблема появляется в пустых строках. Каждая пустая строка приводит к команда не найдена. Почему это произошло?
16 ответов:
убедитесь, что первая строка:
#!/bin/bashвведите свой путь к Баш, если это не
/bin/bash
попробуй:
dos2unix script.shчто Виль конвертировать окончания строк, и т. д. Из Windows в Unix формате. т. е. он удаляет \r (CR) из окончаний строк, чтобы изменить их с
\r\n (CR+LF)до\n (LF).подробнее о
dos2unixкоманда (man page)
другой способ узнать, находится ли ваш файл в 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
если скрипт делает свою работу (относительно) хорошо, то он работает нормально. Ваша проблема, вероятно, одна строка в файле, ссылающаяся на программу, которая либо не находится в пути, не установлена, с ошибкой, или что-то подобное.
один из способов-это поставить
set -xв верхней части вашего скрипта или запустить его сbash -xвместоbash- это выход на линии перед их выполнением и, как правило, просто нужно посмотреть на вывод команды непосредственно перед ошибкой, чтобы увидеть что вызывает проблемуесли, как вы говорите, это пустые строки, вызывающие проблемы, вы можете проверить, что actaully in них. Беги:
od -xcb testscript.shи убедитесь, что нет никаких" невидимых " смешных персонажей, таких как
CTRL-M(возврат каретки) вы можете получить с помощью редактора типа Windows.
Если у вас есть Notepad++ и вы получаете это. sh сообщение об ошибке:"команда не найдена" или это сообщение об ошибке autoconf " строка 615: ../../autoconf / bin / autom4te:нет такого файла или каталога".
в вашем блокноте++, перейдите к Edit -> преобразование EOL затем проверить Macinthos (CR). Это позволит редактировать ваши файлы. Я также рекомендую проверить все файлы с помощью этой команды, потому что скоро такая ошибка произойдет.
попробовать
chmod u+x testscript.shЯ знаю это отсюда: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
была такая же проблема. К сожалению
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. Все выглядело правильно, но на самом деле у меня был неразрывный пробел прямо перед моей командой, которую, конечно, невозможно было заметить невооруженным глазом:if [[ "true" ]]; then highlight --syntax js "var i = 0;" fi, который, в Vim, выглядел так:
if [[ "true" ]]; then highlight --syntax js "var i = 0;" fiтолько после запуска bash script checker
shellcheckЯ нашел проблему.
добавить текущий каталог ( . ) чтобы путь мог выполнить скрипт, просто набрав его имя, которое находится в текущем каталоге:
PATH=.:$PATH
я столкнулся с этим сегодня, рассеянно копируя командную строку доллара
$(перед командной строкой) в скрипт.