Nota: per una soluzione conforme a POSIX, vedere questa risposta .
${BASH_SOURCE[0]}
(o, più semplicemente, $BASH_SOURCE
[1]
) contiene il percorso (potenzialmente relativo) dello script contenitore in tutti gli scenari di invocazione, in particolare anche quando lo script è originato , il che non è vero per $0
.
Inoltre, come sottolinea Charles Duffy , $0
può essere impostato su un valore arbitrario dal chiamante.
D'altro canto, $BASH_SOURCE
può essere vuoto, se non è coinvolto alcun file denominato; per esempio:
echo 'echo "[$BASH_SOURCE]"' | bash
Il seguente esempio lo illustra:
Script foo
:
#!/bin/bash
echo "[$0] vs. [${BASH_SOURCE[0]}]"
$ bash ./foo
[./foo] vs. [./foo]
$ ./foo
[./foo] vs. [./foo]
$ . ./foo
[bash] vs. [./foo]
$0
fa parte della specifica della shell POSIX, mentre BASH_SOURCE
, come suggerisce il nome, è specifica di Bash.
[1] Lettura facoltativa: ${BASH_SOURCE[0]}
vs$BASH_SOURCE
.:
Bash ti permette di fare riferimento a un elemento 0
di una variabile di array usando la notazione scalare : invece di scrivere ${arr[0]}
, puoi scrivere $arr
; in altre parole: se si fa riferimento alla variabile come se fosse uno scalare , si ottiene l'elemento all'indice 0
.
L'uso di questa funzione nasconde il fatto che $arr
è un array, motivo per cui il popolare codice shell linter shellcheck.net emette il seguente avviso (al momento della stesura di questo documento):
SC2128: l'espansione di un array senza un indice fornisce solo il primo elemento.
Nota a margine: sebbene questo avviso sia utile, potrebbe essere più preciso, perché non otterrai necessariamente il primo elemento: è specificamente l'elemento all'indice 0
che viene restituito, quindi se il primo elemento ha un indice più alto, che è possibile in Bash - otterrai la stringa vuota; provare 'a[1]='hi'; echo "$a"'
.
(Al contrario, zsh
mai il rinnegato, anzi fa ritornare il primo elemento, indipendentemente dal suo indice).
Puoi scegliere di evitare questa funzione a causa della sua oscurità, ma funziona in modo prevedibile e, pragmaticamente parlando, raramente, se non mai, avrai bisogno di accedere a indici diversi dalla 0
variabile di array ${BASH_SOURCE[@]}
.
BASH_SOURCE
è stato aggiunto a bash-3.0-alpha. Potresti non averlo, a seconda del tuo regime di test. L'ho trovato mancante sia sui primi Solaris che su OS X. Vedi anche return: può solo "tornare" da una funzione o da uno script originato su U & L.SE.