команда не найдена сообщение об ошибке после попытки запустить сценарий UNIX - PullRequest
12 голосов
/ 05 октября 2010

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

#!/bin/sh
echo HELLO

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

./test

Только для UNIX, чтобы ответить:

./test: Command not found.

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

Ответы [ 10 ]

13 голосов
/ 05 октября 2010

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

chmod +x ./test

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

10 голосов
/ 06 октября 2010

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

ПРОВЕРКА КОНТРОЛЬНЫХ СИМВОЛОВ

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

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

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

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

which zsh
which tcsh
which csh

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

#!/bin/csh
echo HELLO

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

5 голосов
/ 05 октября 2010

Похоже, вам нужен слеш перед корзиной:

#!/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 ' в простом сценарии оболочки. Вы можете обнаружить, что ваша оболочка Bourne находится, например, в /usr/bin, а не /bin.

3 голосов
/ 12 июля 2013

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

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

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

2 голосов
/ 06 октября 2010

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

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

1 голос
/ 12 июля 2013

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

"#! / Bin / bash"

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

1 голос
/ 27 апреля 2012

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

0 голосов
/ 15 января 2016

попробуй chmod u+x ./test

Я знаю это отсюда: http://www.linuxquestions.org/questions/red-hat-31/running-shell-script-command-not-found-202062/

0 голосов
/ 05 октября 2010

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

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

0 голосов
/ 05 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...