Bash Shebang для манекенів?


35

У мене є кілька bash-скриптів, у яких я налаштований, які в основному використовують

#!/bin/bash

але я регулярно стикаюся з деякими, схожими на це

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

і так далі.

Чи може хтось пояснити значення та переваги цих варіантів shebang та чи застосовуються вони до інших шебангів?


Ці параметри є специфічними для Баша (або іншого перекладача). Вони можуть бути однаковими для інших оболонок (наприклад, тире та ksh), але вони були б різними для інших перекладачів, таких як AWK та Python. Ви можете використовувати багато варіантів, які перекладач приймає. Параметри залежать від інтерпретатора, тоді як shebang є функцією ядра.
Денніс Вільямсон

Відповіді:


41

Якщо сценарій /path/to/fooпочинається з #!/bin/bash, тоді виконання /path/to/foo arg1 arg2еквівалентно виконанню /bin/bash /path/too/foo arg1 arg2. Якщо лінія shebang є #!/bin/bash -ex, вона еквівалентна виконанню /bin/bash -ex /path/too/foo arg1 arg2. Цією функцією керує ядро.

Зауважте, що ви можете перенести лише один аргумент у рядку shebang: деякі уніці (наприклад, Linux) приймають лише один аргумент, так що #!/bin/bash -e -xце призведе до того, що баш отримає єдиний аргумент п’яти символів -e -x(синтаксична помилка), а не два аргументи -eта -x.

Для оболонки Борна shта похідних оболонок, таких як POSIX sh, bash, ksh та zsh:

  • -e означає, що якщо будь-яка команда виходить з ладу (що вона вказує, повертаючи ненульовий статус), сценарій негайно припиняється.
  • -x викликає оболонку для друку сліду виконання.

Інші програми можуть розуміти ці параметри, але з різним значенням.


23

Вони параметри , що передаються bashсм help setдля отримання додаткової інформації, в даному випадку:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

2
+1 І -exчи обоє
Найфл

Це заплутано, оскільки вони виглядають як параметри командного рядка, передані в Bash.
Caoilte

2
@Caoilte: І в самому ділі вони є (з man bash): In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...].
cYrus

1
arrgh! моргайте, і ви сумуєте! :).
Caoilte

0

Я просто хотів би згадати ще кращу - як у більш портативних - альтернативу:

#!/usr/bin/env bash

У наведеному вище прикладі використовується envпошук bashфайлу, який не завжди є /bin/bash. Наприклад, #!/bin/bashсценарії старого не працюють на NixOS .

Якщо ви використовуєте , envяк показано вище, ви не можете поставити аргумент , такий як -eв bash(наскільки я знаю). Але ви можете зробити це замість цього:

#!/usr/bin/env bash
set -e

2
Я роблю це постійно, але я б не сказав, що це "більш портативний" - насправді ризик того, щоб користувач запустив щось зовсім інше (від того, що ви можете припустити, що система постачає), набагато більший. Наприклад, Ubuntu все ще постачає Bash 4, тоді як користувач може вибрати Bash 5.
slhck

Так, envвикористання не є гарним, особливо для сценаріїв, на яких запущено python, оскільки ви просто не знаєте, чи за замовчуванням pythonє версія 2 чи 3, і це робить світ різницею для сценаріїв, які потребують певної версії. Краще бути явним, ніж хитрим
smac89
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.