Bash Shebang per i manichini?


36

Ho alcuni script bash che ho installato che principalmente uso

#!/bin/bash

ma mi imbatto regolarmente in alcuni che sembrano

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

e così via.

Qualcuno può spiegare il significato e i vantaggi di queste opzioni di shebang e se si applicano ad altri shebang?


Queste opzioni sono specifiche di Bash (o di un altro interprete). Potrebbero essere uguali per altre shell (trattino e ksh, ad esempio), ma sarebbero diverse per altri interpreti come AWK e Python. È possibile utilizzare molte delle opzioni accettate dall'interprete. Le opzioni sono specifiche dell'interprete mentre shebang è una funzione del kernel.
In pausa fino a nuovo avviso.

Risposte:


41

Se /path/to/fooinizia uno script #!/bin/bash, l'esecuzione /path/to/foo arg1 arg2è equivalente all'esecuzione /bin/bash /path/too/foo arg1 arg2. Se la linea shebang è #!/bin/bash -ex, è equivalente all'esecuzione /bin/bash -ex /path/too/foo arg1 arg2. Questa funzione è gestita dal kernel.

Nota che puoi avere solo un argomento sulla linea shebang: alcuni unices (come Linux) accettano solo un argomento, in modo da #!/bin/bash -e -xportare bash a ricevere il singolo argomento di cinque caratteri -e -x(un errore di sintassi) anziché due argomenti -ee -x.

Per la shell Bourne she le shell derivate come POSIX sh, bash, ksh e zsh:

  • -e significa che se un comando non riesce (che indica restituendo uno stato diverso da zero), lo script verrà terminato immediatamente.
  • -x fa in modo che la shell stampi una traccia di esecuzione.

Altri programmi possono comprendere queste opzioni ma con significati diversi.


24

Sono opzioni passate per bashvedere help setper maggiori informazioni, in questo caso:

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

3
+1 E -exfa entrambe le cose
Nifle

È confuso perché sembrano opzioni della riga di comando passate in Bash.
Caoilte,

2
@Caoilte: E in effetti lo sono (da 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! lampeggia e ti manca! :).
Caoilte,

0

Vorrei solo menzionare un'alternativa ancora migliore - come in più portatile -:

#!/usr/bin/env bash

L'esempio precedente usa envper trovare l' basheseguibile, che non è sempre disponibile /bin/bash. I vecchi #!/bin/bashscript non funzionano su NixOS , per esempio.

Se si utilizza envcome dimostrato in precedenza, non è possibile fornire un argomento come ad esempio -ea bash(per quanto ne so). Ma puoi farlo invece:

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

2
Lo faccio sempre, ma non direi che è "più portatile" - in effetti, il rischio che l'utente esegua qualcosa di completamente diverso (da quello che si può presumere che un sistema venga spedito) è molto maggiore. Ad esempio, Ubuntu spedisce ancora Bash 4, mentre un utente può scegliere di eseguire Bash 5.
slhck

Sì, l' envuso non è buono soprattutto per gli script che eseguono Python perché semplicemente non sai se il valore predefinito pythonè la versione 2 o 3 e questo fa la differenza per gli script che richiedono una versione specifica. Meglio essere espliciti che furbi
smac89
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.