Каждый раз, когда я запускаю сценарий, используя bash scriptname.sh
из командной строки в Debian, я получаю Command Not found
и затем результат сценария.
Сценарий работает, но для каждой пустой строки на экране всегда есть оператор Command Not Found
. Каждая пустая строка приводит к тому, что команда не найдена.
Я запускаю скрипт из папки /var
.
Вот сценарий:
#!/bin/bash
echo Hello World
Я запускаю его, набрав следующее:
bash testscript.sh
Почему это произошло?
Ответ 1
Убедитесь, что ваша первая строка:
#!/bin/bash
Введите путь к bash, если это не /bin/bash
Попробуйте запустить:
dos2unix script.sh
Это преобразует окончания строк и т.д. Из Windows в формат Unix. то есть он обрезает \r (CR) от концов строк, чтобы изменить их с \r\n (CR+LF)
на \n (LF)
.
Подробнее о команде dos2unix
(страница man)
Еще один способ узнать, находится ли ваш файл в формате dos/Win:
cat scriptname.sh | sed 's/\r/<CR>/'
Вывод будет выглядеть примерно так:
#!/bin/sh<CR>
<CR>
echo Hello World<CR>
<CR>
Это выведет весь текст файла с <CR>
отображаемым для каждого символа \r
в файле.
Ответ 2
Вы можете использовать bash -x scriptname.sh
для его прокрутки.
Ответ 3
Я также столкнулся с подобной проблемой. Кажется, что проблема связана с разрешениями. Если вы выполните ls -l
, вы можете определить, что ваш файл может НЕ включать бит выполнения. Это НЕ разрешит выполнение script.:)
Как @artooro добавил в комментарий:
Чтобы исправить эту проблему, запустите chmod +x testscript.sh
Ответ 4
Если script выполняет свою работу (относительно) хорошо, тогда он работает нормально. Вероятно, ваша проблема - это одна строка в файле, ссылающаяся на программу, которая либо не на пути, не установлена, не написана с ошибкой, либо что-то подобное.
Один из способов - разместить set -x
в верхней части вашего script или запустить его с помощью bash -x
вместо bash
- это приведет к выходу строк перед их исполнением, и вам обычно просто нужно посмотреть команда выводит непосредственно перед ошибкой, чтобы увидеть, что вызывает проблему
Если, как вы говорите, это пустые строки, вызывающие проблемы, вы можете проверить, что в них действует. Run:
od -xcb testscript.sh
и убедитесь, что нет "невидимых" забавных символов, таких как CTRL-M
(возврат каретки), которые вы можете получить, используя редактор типа Windows.
Ответ 5
используйте dos2unix
в вашем файле script.
Ответ 6
Если у вас есть Notepad ++, и вы получите это сообщение об ошибке .sh: "команда не найдена
или это сообщение об ошибке autoconf "строка 615:
.. /../autoconf/bin/autom4te: Нет такого файла или каталога ".
На своем Notepad ++ перейдите в Изменить → Преобразование EOL, затем отметьте Macintos (CR).
Это отредактирует ваши файлы. Я также рекомендую проверять все файлы с помощью этой команды,
потому что вскоре такая ошибка произойдет.
Ответ 7
Это может быть тривиально и не связано с вопросом OP, но я часто ошибался в начале, когда изучал скрипты
VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"
Это вызовет ответ "команда не найден". Правильный способ - исключить пробелы
VAR_NAME=$(hostname)
Ответ 8
Попробуйте chmod u+x testscript.sh
Я знаю это отсюда: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/
Ответ 9
для выполнения того, что вы должны предоставить полный путь этого
например
/home/Manuel/mywrittenscript
Ответ 10
Была та же проблема. К сожалению
dos2unix winfile.sh
bash: dos2unix: command not found
поэтому я сделал это для преобразования.
awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh
а затем
bash unixfile.sh
Ответ 11
На Bash для Windows я попытался неправильно запустить
run_me.sh
без./в начале и получил ту же ошибку.
Для людей с фоном Windows правильная форма выглядит излишней:
./run_me.sh
Ответ 12
Проблемы с запущенными скриптами также могут быть связаны с плохим форматированием многострочных команд, например, если у вас есть пробельный символ после разрыва строки "\". Например. это:
./run_me.sh \
--with-some parameter
(обратите внимание, что дополнительное пространство после "\" ) вызовет проблемы, но когда вы удалите это пространство, оно будет работать отлично.
Ответ 13
У меня также была часть 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
я нашел проблему.
Ответ 14
Добавьте текущий каталог (.) в PATH, чтобы иметь возможность выполнить script, просто набрав его имя, которое находится в текущем каталоге:
PATH=.:$PATH
Ответ 15
Я столкнулся с этим сегодня, рассеянно копируя командную строку доллара $
(впереди командной строки) в script.
Ответ 16
Возможно, вы захотите обновить файлы .bashrc и .bash_profile псевдонимами, чтобы распознать вводимую вами команду.
Файлы .bashrc и .bash_profile - это скрытые файлы, которые, вероятно, находятся на вашем диске C :, где вы сохраняете свои программные файлы.