Сценарий Bash печатает «Команда не найдена» в пустых строках


112

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

Сценарий работает, но Command Not Foundдля каждой пустой строки на экране всегда печатается инструкция. Каждая пустая строка означает, что команда не найдена.

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

Вот сценарий:

#!/bin/bash

echo Hello World

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

bash testscript.sh

Почему это произошло?


А если серьезно, то в сети таких жалоб полно. Шелл очень слабый и хромой интерпретатор. Немного здесь и там, и это не удается. Вы должны смотреть даже все пробелы в скрипте. Мой скрипт не работал из-за невидимого символа перевода строки. Вероятно, это единственный язык сценариев, где важны пробелы!
Атул,

1
Используйте bash -x scriptname.shдля отслеживания ошибки. - В моем случае это был sh-файл, сохраненный под Windows с VSCode и окончанием строки как «CRLF». В VSCode в правом нижнем углу вы можете изменить терминатор строки с «CRLF» на «LF». Загрузил этот файл и, наконец, смог выполнить его с помощью bash scriptname.sh.
Кай Ноак,

Это определенно дубликат stackoverflow.com/questions/39527571/…, но многие ответы здесь объясняют ряд других ситуаций, когда вы получаете сообщение «команда не найдена» по другим причинам. Посетителям рекомендуется прочитать все ответы, если ваша проблема не связана конкретно с пустыми строками.
Tripleee

Ответы:


162

Убедитесь, что ваша первая строка:

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


Вероятно, в этом нет необходимости, так как он запускает его напрямую bash scriptname.sh(но, конечно, это все еще хорошая практика).
paxdiablo

1
Привет #! / Bin / bash - первая строчка моего скрипта
Дэвид

1
@chown - у меня была такая же проблема на Mac. Я наткнулся на этот пост. Я не уверен, помогло это OP или нет. Но ваше решение мне помогло.
Prashant

1
Спасибо. Это была именно та проблема, с которой я столкнулся. Эти ответы заставили его работать.
slayedbylucifer

5
Как можно написать ответ на вопрос по программированию во время движения?
Омар Тарик


47

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

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

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


4
Чтобы решить эту проблему, бегитеchmod +x testscript.sh
artooro

Это был ответ, который сработал для меня. Мне всегда говорили, что у меня нет разрешения, поэтому я сделал его sudo'ed, и мне сказали, что команда не найдена. Не думал проверять разрешения.
DiamondDrake

1
Спасибо Lypso345, это решило мою проблему.
ammills01

chmod 777 testscript.sh FTW
GeneCode 07

16

Это может быть тривиально и не связано с вопросом OP, но я часто ошибался в начале, когда изучал скрипты.

VAR_NAME = $(hostname)
echo "the hostname is ${VAR_NAME}"  

Это приведет к ответу «команда не найдена». Правильный способ - устранить пробелы

VAR_NAME=$(hostname)

11

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

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

Если, как вы говорите, проблемы вызывают пустые строки, вы можете проверить, что на самом деле в них содержится . Бегать:

od -xcb testscript.sh

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


+1 за команду 'od'! Круто, я об этом не знал! Спасибо!
chown

11

В Bash для Windows я неправильно пытался запустить

run_me.sh 

без ./ в начале и получил ту же ошибку.

Для людей с фоном Windows правильная форма выглядит излишней:

./run_me.sh



6

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

/home/Manuel/mywrittenscript

В действительности оболочка вообще не заботится о расширениях файлов. Не уверен, что это заслуживает отдельного ответа.
Tripleee

Конечно, файловая система .in linux, в отличие от расширений Windows, используется просто как часть имени и ничего не говорит о содержимом файла. В моем случае я не должен говорить об ограничении.
Масуд Могини 01

6

Если у вас есть Notepad ++, и вы получаете это сообщение об ошибке .sh: «команда не найдена» или это сообщение об ошибке autoconf, строка 615: ../../autoconf/bin/autom4te: Нет такого файла или каталога » .

На вашем Notepad ++ перейдите в Edit -> EOL Conversion, затем отметьте Macinthos (CR) . Это отредактирует ваши файлы. Я также рекомендую проверять все файлы с помощью этой команды, потому что скоро возникнет такая ошибка.


Спасибо за это. В моем случае я запускал скрипт в дистрибутиве busybox linux. Была такая же ошибка «не найдено» во всех пустых строках в моих скриптах. у него также были проблемы с оператором if / else. изменение EOL в Notepad ++ на Unix исправило это.
GeneCode 07

4

Была такая же проблема. К сожалению

dos2unix winfile.sh
bash: dos2unix: command not found

поэтому я сделал это, чтобы преобразовать.

 awk '{ sub("\r$", ""); print }' winfile.sh > unixfile.sh

а потом

bash unixfile.sh

2

Проблемы с запуском скриптов также могут быть связаны с неправильным форматированием многострочных команд, например, если у вас есть пробельный символ после разрыва строки "\". Например, это:

./run_me.sh \ 
--with-some parameter

(обратите внимание, что лишний пробел после "\") вызовет проблемы, но когда вы удалите это пространство, он будет работать нормально.


0

У меня также были некоторые из файлов 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 shellcheckя обнаружил проблему.


shellcheckдоступен в режиме онлайн, хотя вам, конечно, нужно скопировать + вставить ваш скрипт именно для того, чтобы это помогло. shellcheck.net
tripleee 02

0

Я столкнулся с этим сегодня, рассеянно копируя командную строку доллара $(перед командной строкой) в сценарий.


-1

Добавьте текущий каталог (.) В PATH, чтобы иметь возможность выполнить сценарий, просто введя его имя, которое находится в текущем каталоге:

PATH=.:$PATH

1
Это считается уязвимостью безопасности. НЕ ДОБАВЛЯЙТЕ .В ПУТЬ.
gniourf_gniourf

Объяснение того, почему этот «ответ» - плохая идея: superuser.com/questions/156582/…
jmng

-1

Вы можете обновить файлы .bashrc и .bash_profile псевдонимами, чтобы распознавать вводимую вами команду.

Файлы .bashrc и .bash_profile - это скрытые файлы, которые, вероятно, находятся на вашем диске C :, где вы сохраняете свои программные файлы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.