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


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

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

вот скрипт:

#!/bin/bash

echo Hello World

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

bash testscript.sh

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

16 81

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 символ в файл.

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

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

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

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

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

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

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

od -xcb testscript.sh

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

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

Если у вас есть 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/

для выполнения этого вы должны предоставить полный путь этого например

/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:, где вы сохраняете свои программные файлы.