Скрипты Bash не будут работать без ввода «bash» перед ним

11

В нашей школьной системе, мы можем запускать файлы сценариев без ввода bashили cshили что там у вас , без указания , какой тип сценария это. В Ubuntu, однако, я должен напечатать, bash script.bashнапример. Это всегда необходимо в Ubuntu, или я могу изменить некоторые настройки?

muttley91
источник
1
это установлено как исполняемый файл?
jsolarski
да, файл исполняемый, поэтому я думаю, что он будет работать сам по себе.
muttley91
1
Какую ошибку вы получаете при вводе ./script? Вы уверены, что скрипт не был изменен из редактора Windows, добавив дополнительный символ в конце строки? Это сломало бы первую строку, указывая, что скрипт должен быть выполнен с помощью bash.
Жоау Пинту
1
Как вы это запустите, и что за сообщение об ошибке?
пользователь неизвестен
+1 за .shнеиспользование скриптов bash. Как правило, расширения файлов не используются для исполняемых скриптов в мире UNIX.
nyuszika7h

Ответы:

17
  1. Убедитесь, что вы запускаете скрипт с ./scriptили полный путь или что-то еще. Просто scriptможет не работать (это работает, если каталог находится $PATH, например /usr/bin), так как в системах UNIX это не привычка иметь текущий каталог в вашем пути (по соображениям безопасности, и это хорошо!)

  2. Убедитесь, что скрипт исполняемый, например: chmod +x scriptсделает его исполняемым.

  3. Убедитесь, что у вас есть #!/bin/bashпервая строка в вашем скрипте. Также убедитесь, что он не редактируется с помощью какого-то редактора Windows, так как он часто использует «тип DOS» eol (конец строки), который отличается от UNIX (если контрольный список выше, но вы получили «плохо» интерпретатор: нет такого файла или каталога "или около того, даже если это / bin / bash, это часто является причиной, поскольку не для печати - так что вы обычно не видите его - \ r будет рассматриваться как часть путь переводчика)

Другие уже упоминали: важно иметь, /bin/bashесли вы используете функции bash, на них тоже есть /bin/shсимволические ссылки /bin/bash, но сейчас (насколько я заметил) это символические ссылки, dashкоторые не обеспечат совместимость с bash, только POSIX sh. Это очень важно, даже у довольно дорогого программного обеспечения в нашей фирме есть эта проблема: сценарии содержат #!/bin/shпервую строку, но это также зависит от функциональности bash.

LGB
источник
Поэтому мне придется запустить его так: ./script, как я обнаружил. Это лучше, чем каждый раз набирать «bash», и это имеет смысл. Я думаю, что знал это раньше, это просто ускользнуло от меня. О, хорошо, спасибо!
muttley91
Теоретически вы можете поместить текущий рабочий каталог в переменную PATH, чтобы затем вы могли использовать просто «скрипт» вместо «./script», но я предупреждаю вас: это действительно не привычка в системах UNIX, и это может быть проблемой безопасности ! Кроме того, в школе нехорошо учить вещи способом, который никогда не был решением для систем UNIX, поэтому я бы избегал этого решения ...
LGB
1
Или, предпочтительно, #!/usr/bin/env bashкоторый является немного более портативным.
Ястреб
4

Убедитесь, что первая строка файла гласит:

#!/bin/bash

Если шебанг есть #!/bin/sh, вы не должны использовать какие-либо специфические для bash функции, только POSIX. Даже если /bin/shэто символическая ссылка bash, bash будет работать в режиме совместимости с POSIX при запуске от имени sh, отключая некоторые (но не все) функции bash.

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

geirha
источник
Нет, я все равно выбил его из привычки.
muttley91
0

Альтернативный, сильно обескураженный способ - добавление .к PATH.

PATH=".:$PATH"

или

PATH="$PATH:."

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

Учтите следующее:

Файл: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Скорее всего, вы даже не заметите, пока не станет слишком поздно.

nyuszika7h
источник
1
Выбор слова слегка вводит в заблуждение здесь. Команды не будут переопределены. Если у вас есть команда в текущем рабочем каталоге, имя которой совпадает с именем в системных каталогах, скажем, echoнапример, то, что в вашем каталоге будет использоваться просто потому, что этот каталог задан в PATHпеременной перед /bin. Shell просто ищет команды в определенных каталогах в зависимости от их порядка в PATHи не переопределяет / уничтожает что-либо. Но да, это имеет значение
Сергей Колодяжный