Bash: rilevare esegui vs sorgente in uno script?


19

Ho uno script disseminato nel mio filesystem (effetto collaterale di un processo di compilazione) che imposta alcune variabili d'ambiente globali (LD_LIBRARY_PATH, PATH, ROOTDIR, ecc.) Che devono essere nella mia shell per un corretto funzionamento. Ovviamente, ciò significa che ho bisogno source script.sho . script.shper farlo funzionare, e non ./script.sh(che genererebbe una nuova shell e non impostare le variabili nella mia shell corrente).

C'è qualcosa che posso aggiungere allo script per impedire (o avvisare) qualcuno in esecuzione ./script.sh?

Risposte:


15

In uno script shell, $0è il nome dello script attualmente in esecuzione. Puoi usarlo per sapere se tieni o esegui in questo modo:

if [[ "$(basename -- "$0")" == "script.sh" ]]; then
    echo "Don't run $0, source it" >&2
    exit 1
fi

5

Il modo più semplice bashè:

if [ "$0" = "$BASH_SOURCE" ]; then
    echo "Error: Script must be sourced"
    exit 1
fi

$BASH_SOURCE contiene sempre il nome / percorso dello script.

$0 contiene solo il nome / percorso dello script quando NON è di provenienza.

Quindi quando corrispondono, ciò significa che la sceneggiatura NON è stata fornita.


1

Questo è stato discusso su SO . La risposta più votata da @barroyo dice di usare

[[ "${BASH_SOURCE[0]}" != "${0}" ]] && echo "script ${BASH_SOURCE[0]} is being sourced ..."

@will: Il manuale dice: Una variabile di matrice i cui membri sono i nomi dei file di origine in cui sono definiti i nomi delle funzioni di shell corrispondenti nella variabile di matrice FUNCNAME. Come una funzione?
serv-inc,

1

Un'altra opzione potrebbe essere quella di rimuovere le autorizzazioni di esecuzione. In tal caso, non può essere eseguito ma può comunque essere acquistato.


1
Questo è incompleto. È comunque possibile eseguire script con bash scriptindipendentemente dal flag di esecuzione su uno script. Anche sotto Cygwin (questo conta?) Non puoi togliere i flag di esecuzione.
Tino,

0

Oltre a controllare $ 0 ( risposta Mikel ) può essere utile per cambiare l'estensione da .sh a .src, ad esempio. Aiuterà a capire chiunque non dovrebbe eseguire questo script.


0

Crea un interprete personalizzato source_reminder:

#!/bin/sh
printf "%s\n" "Source me!" >&2
exit 1

Non dimenticare di renderlo eseguibile. Quindi usalo nel tuo script:

#!/path/to/your/source_reminder
foo
bar
whatever

Ora se esegui lo script senza approvvigionamento, il promemoria farà il suo lavoro.


Bella presa. #!/bin/echo do not executeo #!/bin/falseo #!/usr/bin/awk BEGIN { print "you must source " ARGV[1]; exit(1) }. Tuttavia, questo non cattura il caso in cui lo script viene eseguito con qualcosa del genere sh script(poiché questo ignora lo Shebang).
Tino,
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.