Скрипт 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
я столкнулся с этим сегодня, рассеянно копируя командную строку доллара
$
(перед командной строкой) в скрипт.