Я написал простой скрипт. Когда я запустил sh <myscriptname.sh>, я получил правильный вывод, но когда я запустил ./<myscriptname.sh>, я получил ошибку.
В чем разница между тем, когда я делаю sh и ./?
Есть три основные причины, по которым вы можете получить сообщение об ошибке:
chmod + x & lt; myscriptname.sh & gt;
, чтобы исправить это noexec
») копирует сценарий на / usr / local / bin
#!
имеет ошибку, убедитесь, что первая строка - #! / bin / sh
или #! / bin / bash
[ ! d11] Если ваша первая строка выглядит правильно, но все еще не работает, убедитесь, что файл не имеет окончаний строки DOS.
Ошибка будет выглядеть примерно так: :
$ ./myscript.sh bash: ./myscript.sh: / bin / bash ^ M: плохой интерпретатор: нет такого файла или каталога
Вы можете исправить это, запустив dos2unix & lt; myscriptname.sh & gt;
, или если у вас этого нет, perl -p -i -e 's / \r \n $ / \n / '& lt; myscriptname.sh & gt;
.
mkdir ~ / bin; cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;
Не / usr / sbin
, это для несущественных административных инструментов, / usr / local / bin
- лучший выбор, если вы не хотите иметь ~ / bin /
, но избегать sudo
как можно больше.
Разница, которую вы делаете,
sh
, вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала, ./
, вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh
), сохраняя бесценное время для будущих времен: -) Короткий вариант:
sh
- интерпретатор командной строки (тире) .Running sh my_script
заставляет интерпретировать скрипт. ./
пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash
или даже #! / bin / ruby
(как показано на выполнение ruby my_script
). И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».
Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).
И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.
Есть три основные причины, по которым вы можете получить сообщение об ошибке:
chmod + x & lt; myscriptname.sh & gt;
, чтобы исправить это noexec
») копирует сценарий на / usr / local / bin
#!
имеет ошибку, убедитесь, что первая строка - #! / bin / sh
или #! / bin / bash
[ ! d11] Если ваша первая строка выглядит правильно, но все еще не работает, убедитесь, что файл не имеет окончаний строки DOS.
Ошибка будет выглядеть примерно так: :
$ ./myscript.sh bash: ./myscript.sh: / bin / bash ^ M: плохой интерпретатор: нет такого файла или каталога
Вы можете исправить это, запустив dos2unix & lt; myscriptname.sh & gt;
, или если у вас этого нет, perl -p -i -e 's / \r \n $ / \n / '& lt; myscriptname.sh & gt;
.
Разница, которую вы делаете,
sh
, вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала, ./
, вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh
), сохраняя бесценное время для будущих времен: -) mkdir ~ / bin; cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;
Не / usr / sbin
, это для несущественных административных инструментов, / usr / local / bin
- лучший выбор, если вы не хотите иметь ~ / bin /
, но избегать sudo
как можно больше.
Короткий вариант:
sh
- интерпретатор командной строки (тире) .Running sh my_script
заставляет интерпретировать скрипт. ./
пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash
или даже #! / bin / ruby
(как показано на выполнение ruby my_script
). И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».
Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).
И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.
Есть три основные причины, по которым вы можете получить сообщение об ошибке:
chmod + x & lt; myscriptname.sh & gt;
, чтобы исправить это noexec
») копирует сценарий на / usr / local / bin
#!
имеет ошибку, убедитесь, что первая строка - #! / bin / sh
или #! / bin / bash
[ ! d11] Если ваша первая строка выглядит правильно, но все еще не работает, убедитесь, что файл не имеет окончаний строки DOS.
Ошибка будет выглядеть примерно так: :
$ ./myscript.sh bash: ./myscript.sh: / bin / bash ^ M: плохой интерпретатор: нет такого файла или каталога
Вы можете исправить это, запустив dos2unix & lt; myscriptname.sh & gt;
, или если у вас этого нет, perl -p -i -e 's / \r \n $ / \n / '& lt; myscriptname.sh & gt;
.
Разница, которую вы делаете,
sh
, вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала, ./
, вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh
), сохраняя бесценное время для будущих времен: -) mkdir ~ / bin; cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;
Не / usr / sbin
, это для несущественных административных инструментов, / usr / local / bin
- лучший выбор, если вы не хотите иметь ~ / bin /
, но избегать sudo
как можно больше.
Короткий вариант:
sh
- интерпретатор командной строки (тире) .Running sh my_script
заставляет интерпретировать скрипт. ./
пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash
или даже #! / bin / ruby
(как показано на выполнение ruby my_script
). ./
, который находит что-либо, это метод выполнения системы, который смотрит на первые два байта файла.
– Martin Owens -doctormo-
23 January 2011 в 20:08
И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».
Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).
И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.
Есть три основные причины, по которым вы можете получить сообщение об ошибке:
chmod + x & lt; myscriptname.sh & gt;
, чтобы исправить это noexec
») копирует сценарий на / usr / local / bin
#!
имеет ошибку, убедитесь, что первая строка - #! / bin / sh
или #! / bin / bash
[ ! d11] Если ваша первая строка выглядит правильно, но все еще не работает, убедитесь, что файл не имеет окончаний строки DOS.
Ошибка будет выглядеть примерно так: :
$ ./myscript.sh bash: ./myscript.sh: / bin / bash ^ M: плохой интерпретатор: нет такого файла или каталога
Вы можете исправить это, запустив dos2unix & lt; myscriptname.sh & gt;
, или если у вас этого нет, perl -p -i -e 's / \r \n $ / \n / '& lt; myscriptname.sh & gt;
.
Разница, которую вы делаете,
sh
, вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала, ./
, вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh
), сохраняя бесценное время для будущих времен: -) mkdir ~ / bin; cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;
Не / usr / sbin
, это для несущественных административных инструментов, / usr / local / bin
- лучший выбор, если вы не хотите иметь ~ / bin /
, но избегать sudo
как можно больше.
~ / .profile
уже есть код для добавления ~ / bin
, если он существует, в PATH
. В другой заметке не ставьте расширения на скрипты.
– geirha
24 January 2011 в 11:44
ls ~ / bin / | wc -l = 428
) Я положил туда много чего;)
– Joey1978
24 January 2011 в 12:01
/ bin
и / usr / bin
, вы увидите, что они не используют расширения.
– geirha
2 February 2011 в 12:49