Файл Perl не работает в терминале [dубликат]

Я написал простой скрипт. Когда я запустил sh <myscriptname.sh>, я получил правильный вывод, но когда я запустил ./<myscriptname.sh>, я получил ошибку.

В чем разница между тем, когда я делаю sh и ./?

69
задан 8 April 2011 в 00:31

48 ответов

Есть три основные причины, по которым вы можете получить сообщение об ошибке:

  • файл не является исполняемым запустите 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; .

3
ответ дан 5 August 2018 в 10:21
  mkdir ~ / bin;  cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;  

Не / usr / sbin , это для несущественных административных инструментов, / usr / local / bin - лучший выбор, если вы не хотите иметь ~ / bin / , но избегать sudo как можно больше.

0
ответ дан 5 August 2018 в 10:21

Разница, которую вы делаете,

  • с sh , вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала,
  • с ./ , вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh ), сохраняя бесценное время для будущих времен: -)
3
ответ дан 5 August 2018 в 10:21

Короткий вариант:

  • sh - интерпретатор командной строки (тире) .Running sh my_script заставляет интерпретировать скрипт.
  • ./ пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash или даже #! / bin / ruby ​​ (как показано на выполнение ruby ​​my_script ).
  • [ ! d9]
34
ответ дан 7 August 2018 в 04:11

И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».

Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).

И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.

0
ответ дан 7 August 2018 в 04:11

Есть три основные причины, по которым вы можете получить сообщение об ошибке:

  • файл не является исполняемым запустите 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; .

3
ответ дан 7 August 2018 в 04:11

Разница, которую вы делаете,

  • с sh , вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала,
  • с ./ , вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh ), сохраняя бесценное время для будущих времен: -)
3
ответ дан 7 August 2018 в 04:11
  mkdir ~ / bin;  cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;  

Не / usr / sbin , это для несущественных административных инструментов, / usr / local / bin - лучший выбор, если вы не хотите иметь ~ / bin / , но избегать sudo как можно больше.

0
ответ дан 7 August 2018 в 04:11

Короткий вариант:

  • sh - интерпретатор командной строки (тире) .Running sh my_script заставляет интерпретировать скрипт.
  • ./ пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash или даже #! / bin / ruby ​​ (как показано на выполнение ruby ​​my_script ).
  • [ ! d9]
34
ответ дан 9 August 2018 в 08:35

И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».

Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).

И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.

0
ответ дан 9 August 2018 в 08:35

Есть три основные причины, по которым вы можете получить сообщение об ошибке:

  • файл не является исполняемым запустите 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; .

3
ответ дан 9 August 2018 в 08:35

Разница, которую вы делаете,

  • с sh , вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала,
  • с ./ , вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh ), сохраняя бесценное время для будущих времен: -)
3
ответ дан 9 August 2018 в 08:35
  mkdir ~ / bin;  cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;  

Не / usr / sbin , это для несущественных административных инструментов, / usr / local / bin - лучший выбор, если вы не хотите иметь ~ / bin / , но избегать sudo как можно больше.

0
ответ дан 9 August 2018 в 08:35

Короткий вариант:

  • sh - интерпретатор командной строки (тире) .Running sh my_script заставляет интерпретировать скрипт.
  • ./ пытается выяснить, какой интерпретатор использовать, посмотрев на первую строку. Например. #! / bin / bash или даже #! / bin / ruby ​​ (как показано на выполнение ruby ​​my_script ).
  • [ ! d9]
34
ответ дан 15 August 2018 в 03:52

И ответ заключается в том, что sh - это имя для очень популярной оболочки. Но устарели и заменены другими. В настоящее время sh связан с другими оболочками, установленными на машине. например У меня есть баш. Запуск любой оболочки из sh обычно запускает некоторый режим совместимости с оригинальным поведением «оболочки».

Так что решение довольно простое. Посмотрите, что находится за командой sh (ls -al / bin / sh), и поставьте #! / Bin / whatever_you_find_there в качестве первой строки (или если что-то подобное в вашем скрипте отредактирует).

И, альтернативно, может возникнуть ошибка в самом скрипте. Подобно зависимости, которую выполняет sh, но не интерпретатор, который фактически используется.

0
ответ дан 15 August 2018 в 03:52

Есть три основные причины, по которым вы можете получить сообщение об ошибке:

  • файл не является исполняемым запустите 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; .

3
ответ дан 15 August 2018 в 03:52

Разница, которую вы делаете,

  • с sh , вы запускаете программу, которая будет интерпретировать строки в вашем скрипте так же, как вы бы набрали их в интерактивной подсказке терминала,
  • с ./ , вы делаете ярлык, предполагая, что скрипт находится прямо здесь, в текущем каталоге, в котором вы сидите в И он будет исполняться (потому что, например, вы выпустили chmod + x myscript.sh ), сохраняя бесценное время для будущих времен: -)
3
ответ дан 15 August 2018 в 03:52
  mkdir ~ / bin;  cp myscript.sh ~ / bin / echo "export PATH =" $ PATH: / home / $ USER / bin "& gt; ~ / .profile; source ~ / .profile;  

Не / usr / sbin , это для несущественных административных инструментов, / usr / local / bin - лучший выбор, если вы не хотите иметь ~ / bin / , но избегать sudo как можно больше.

0
ответ дан 15 August 2018 в 03:52
  • 1
    В Ubuntu по умолчанию ~ / .profile уже есть код для добавления ~ / bin , если он существует, в PATH . В другой заметке не ставьте расширения на скрипты. – geirha 24 January 2011 в 11:44
  • 2
    Я ссылался на & lt; myscriptname.sh & gt ;, но что является обоснованием для того, чтобы не помещать расширения в скрипты? Обычно я делаю это, потому что наличие видимых текстовых файлов не позволяет мне пытаться редактировать двоичные файлы, которые я также храню в ~ / bin /. ( ls ~ / bin / | wc -l = 428 ) Я положил туда много чего;) – Joey1978 24 January 2011 в 12:01
  • 3
    Представьте, что вы пишете сценарий для достижения конкретной задачи. Тогда вы понимаете, что писать этот сценарий в python сделает его намного более эффективным, поэтому вы переписываете его в python. Теперь у вас есть два варианта. 1) Оставьте теперь очень вводящее в заблуждение расширение .sh, или 2) переименуйте скрипт и выполните поиск и замените все использование сценария на использование нового имени. Если вы посмотрите на сценарии в / bin и / usr / bin , вы увидите, что они не используют расширения. – geirha 2 February 2011 в 12:49

Другие вопросы по тегам:

Похожие вопросы: