Команда не найдена сообщение об ошибке при запуске сценария

Я изучаю, как создавать сценарии оболочки в UNIX, но я продолжаю сталкиваться с этой глупой ошибкой. Скажем, я делаю script следующим образом:

#!/bin/sh
echo HELLO

Я сохраняю файл в качестве теста и выполняю исполняемую мной команду с помощью теста chmod 700. Я сохраняю файл в своем домашнем каталоге и (пытаюсь) запустить файл следующим образом:

./test

Только для ответа UNIX:

./test: Command not found.

Что происходит? Когда я набираю ls -l, рядом с именем файла есть звездочка. Этого не было, прежде чем я использовал команду chmod. Может ли кто-нибудь сказать мне, что я делаю неправильно?

Ответ 1

Сделайте его исполняемым:

chmod +x ./test

и сохраните файл в формате Unix. И: проверьте, является ли ваш раздел исполняемым (mount).

Ответ 2

Это очень странно. Описанные вами шаги должны были работать, поэтому в вашей среде должна быть небольшая ошибка или выполнение этих шагов. Есть несколько вещей, которые вы можете сделать, чтобы помочь диагностировать это:

ПРОВЕРКА ДЛЯ ХАРАКТЕРОВ УПРАВЛЕНИЯ

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

cat -vt ./test

Если вы видите неожиданный дополнительный текст, который может объяснить проблему. Например, "^ M" в конце строки указывает, что ваш редактор сохранил файл в формате Windows.

РЕГЕНЕРАЦИЯ НАДЕЖНОСТИ ФАЙЛА

Чтобы создать хорошо известный ./test2, скопируйте-вставьте следующие команды:

`which bash`
printf "#\!`which sh`\necho HELLO\n" > ./test2
chmod +x ./test2
./test2
exit

ПРОВЕРКА, ЧТО КОМАНДА НЕ МОЖЕТ БЫТЬ НАЙДЕНА

Если вы наберете...

./ajio

... вы получаете точно...

./ajio: Command not found.  

... как вы описали с помощью ./test? Я просто написал имя ajio, чтобы этого не существовало. Если они соответствуют сообщениям, это не говорит вам ничего нового. Но если сообщения отличаются друг от друга, это подтверждает, что ./test был как минимум найден и выполнен.

Также возможно, что ваша версия sh пытается сказать вам, что test не может быть найден, но при запуске test некоторая команда, которую пыталась запустить оболочка, не найдена. Это не должна быть команда echo, как и большинство реализаций оболочки, которые будут внутренней командой, реализованной внутри оболочки. Но оболочка может запустить инициализацию script, содержащую строку, указывающую команду, которую он не может выполнить. Если вы запустите man sh, он расскажет вам обо всех различных файлах запуска, которые ваша оболочка может попробовать запустить. Они могут отличаться от тех, которые используются при интерактивном запуске оболочки. Но, как новичок, это может быть сложной проверкой действительности этих скриптов. Вероятно, любые фиктивные настройки были бы в вашем личном процессе запуска оболочки, хотя бы и не затрагивали бы всю установку Linux, поэтому запустите ls -ld ~/.*, чтобы перечислить скрытые файлы в вашем домашнем каталоге, и проверьте все, что похоже на файлы запуска оболочки (например, ~/.bashrc, ~/.profile, ~/.bash_login). Проверяйте, какие команды, которые они задают, могут быть найдены с ними и будут вызваны после того, как переменная пути будет установлена, чтобы включить их местоположение.

СРАВНЕНИЕ К ДРУГИМ ОБОЛОЧКАМ

Если возникла проблема с установкой/инициализацией/bin/sh, вы можете обойти ее, вызвав другую оболочку. Попробуйте...

which zsh
which tcsh
which csh

... и если один из них найдет для вас альтернативную оболочку, отредактируйте или заново создайте файл, указав, что shell, ala...

#!/bin/csh
echo HELLO

... then chmod +x it и ./ -run it. Если это работает, то вы знаете, что ваша проблема связана с/bin/sh.

Ответ 3

Похоже, вам нужна косая черта перед бункером:

#!/bin/sh
# ^

Все остальное выглядит отлично... Я предполагаю, что /bin/sh - это местоположение исполняемой оболочки Bournse - если это не так, вам нужно будет при необходимости отрегулировать. Без ведущей косой черты ваша оболочка ищет bin/sh относительно вашего текущего каталога, а не там, где она действительно находится.

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

Еще несколько предложений - на моей машине я получаю следующие результаты:

# tells you where sh resides, if it is on your path
$ which sh
/bin/sh

# tells you which shell you are currently using
$ echo $SHELL
/bin/tcsh

Я могу использовать любой из них для строки shebang в простой оболочке script. Вы можете обнаружить, что ваша оболочка Bourne находится в /usr/bin, а не /bin, например.

Ответ 4

Во-первых, проверьте, присутствует ли /bin/sh, если это не ваша проблема.

Если у вас установлен /bin/sh, я думаю, что это произойдет, если ваш путь не настроен должным образом. В этом случае вы можете попробовать: /bin/sh test.sh из текущего рабочего каталога, где находится test.sh.

Также попробуйте dos2unix test.sh, если вы скопировали файл из окон.

Ответ 5

Когда ./test является исполняемым script, и все же его выполнение дает сообщение об ошибке ./test: Command not found, проверьте, существует ли интерпретатор. Вы должны указать абсолютный путь (переменная среды PATH не используется).

Если файл прошел через компьютер Windows, убедитесь, что в конце строки нет ложного возврата каретки, так как CR будет частью имени файла интерпретатора. Вы можете проверить с помощью <test head -n 1 | od -t x1: если это заканчивается на 0d 0a, существует CR, и вам нужно его удалить (возможно, вам также потребуется удалить CR из других строк).

Ответ 6

У меня была такая же проблема, когда я скопировал файл из Windows в Linux и попытался выполнить его. Я сделал все предложения выше, но ничего не помогло, пока я не сделал dos2unix в файле и не исправил его. Возможно, это не так, но просто поставьте его там

Ответ 7

У меня была аналогичная проблема со старой виртуальной машиной SCO OpenServer 5.0.7. Поднял меня орехами, что я не мог запустить определенные скрипты, которые начинались с

"#!/Bin/ bash"

(минус кавычки, конечно). Прочитав здесь темы, мне стало ясно, существовал ли /bin/ bash. Оказывается, он пропал без вести. Я установил с компакт-диска SKUNKWARE2000, и все было хорошо.

Ответ 8

#! сообщает Unix выполнить ваш script с помощью указанной программы. В вашем случае вы указали bin/sh, но это должно быть /bin/sh. Сообщение об ошибке, которое дает Unix, не совсем понятно, какую программу он не может найти.

Ответ 9

Чтобы добавить ответ Мартина, вы говорите, что сохраните файл в своем домашнем каталоге и запустите его как ./test. Это будет работать, только если ваш текущий рабочий каталог совпадает с вашим домашним каталогом.

Звездочка рядом с именем файла означает, что файл является исполняемым.