Разница между командами в скрипте bash и командами в терминале

13

Есть ли различия между командами, которые вы вводите в терминал, и командами, которые вы включаете в скрипт?

jth41
источник
Абсолютно не глупый вопрос! Проверьте это (сначала), затем это , и это .
Эмануэль Берг

Ответы:

7

Ваш терминал запускает оболочку (скорее всего bash), которая запрашивает ваши команды и запускает их.

Помимо этого интерактивного режима вы также можете использовать свою оболочку для запуска команд из файла. Чтобы выполнить команды в вашем файле, вы можете либо напрямую вызвать оболочку, bash scriptлибо вы можете запустить свой файл с «shebang» #!/bin/bashи сделать его исполняемым ( chmod +x script). Затем вы можете рассматривать скрипт как двоичный файл и выполнять его, например, как ./scriptили поместить его в место, где его ищет оболочка. ( echo $PATH)

Скорее всего, и ваша интерактивная оболочка, и оболочка, используемая для запуска bash. С точки зрения «первого дня обучения Linux» Bash работает одинаково в обоих режимах. - Гораздо позже вы можете наткнуться на небольшие различия. Если вы действительно хотите узнать о деталях, я бы предложил почитать man bashи найти места с упоминанием «интерактивный». (Вы можете найти страницу справочника, нажав /.)

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

$ export a=1
$ echo $a
1
$ bash -c 'echo $a;a=2;echo $a' # change the value in a script
1
2
$ echo $a # value not changed here
1
$ 

Без экспорта aдаже не виден внутренний скрипт.

Михась
источник
1

В общем случае ответ будет «нет», команды в оболочке одинаковы в сценариях, в синтаксисе и семантике.

Но есть куча мелких нюансов, связанных с настройкой среды (какие переменные используются и для чего они установлены).

  • интерактивной оболочкой для Linux является bash, но в сценариях часто используются другие интерпретаторы ( shчто является предшественником bash, kshто же самое, что bash), поэтому необходимо учитывать, какая оболочка используется (имя текущей оболочки традиционно хранится в переменной SHELL, попробуйте набрать echo $SHELL).

  • могут быть различия в конфигурации одного и того же интерпретатора для интерактивного сеанса и для выполнения скрипта.

Дмитрий Сиренко
источник
-1

Нет. Сценарий - это список команд, которые вы можете ввести в терминале.

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

И наоборот, вы можете «сохранить» свои команды терминала внутри файла, превратить его в повторно используемый скрипт и поделиться им со своей семьей и друзьями.

Матье Ж.
источник
4
Нет. Вставка содержимого эквивалентна поиску сценария. Это изменит все виды параметров в текущей оболочке, которые не будут изменены простым запуском скрипта.
Михас
ты прав. но насколько его вопросы идут. Я думаю, что мы можем сказать, что это очень похоже. но да, чтобы перевести то, что сказал Михас, в терминах noob'er. вставка содержимого сценария эквивалентна операции source script_file. который будет редактировать переменные ENV в текущем контексте. во время выполнения сценария as ./script_fileне изменяет ENV, если exportне используется явно.
Матье Дж.
1
Нет. Даже при exportэтом сценарий не может изменять какие-либо переменные вызывающей оболочки. То же самое касается таких вещей, как PWD, определенные псевдонимы, функции и тому подобное. Они могут быть изменены только в интерактивном режиме или путем поиска файла. Но да, это, вероятно, ничего, что кто-то наткнется в первый день. :)
Михас
1
@michas: Ну, еще лучше дать правильное описание. Если новичок амбициозен и имеет рабочие привычки, он или она быстро подберут. Если мы попытаемся рассказать сказку ребенку, мы просто упадем на ноги и создадим непостижимое впечатление - кроме того, новичок может вернуться позже. Хотя я не считаю себя новичком, есть много вещей, которые я не знаю, и я был бы оскорблен, если бы кто-нибудь отказался отвечать на мои вопросы, потому что «ты еще не там, младший».
Эмануэль Берг