Gli script Shell vengono normalmente trattati come se fossero gli stessi di qualsiasi altro tipo di file eseguibile, come binari, script Python, script Perl o qualsiasi altro tipo di script. Hanno uno shebang nella parte superiore che indica al kernel di eseguirli attraverso la shell. Si prevede che vengano invocati allo stesso modo di qualsiasi altro comando.
Come tale, una nuova shell viene avviata ogni volta che viene invocato lo script e qualsiasi impostazione come quella set -f
presente nella shell invocante o in qualsiasi altra istanza della shell nel sistema è irrilevante.
Ovviamente è possibile per gli utenti procurarsi il tuo script invece di eseguirlo, ad esempio in questo modo:
. /path/to/your/script
o per eseguirlo in una shell che ha impostazioni non predefinite come questa:
sh -f /path/to/your/script
ma quelli non sono considerati modi normali o invocano il tuo script e gli utenti che lo fanno dovrebbero aspettarsi qualsiasi cosa ottengano di conseguenza.
Si noti che ci sono alcuni script che devono essere di provenienza, non eseguiti, perché il loro scopo è quello di modificare il CWD o impostare le variabili di ambiente che devono essere riflesse nell'ambiente della shell di approvvigionamento, ma sono in minoranza e di solito è fatto come parte di un protocollo concordato. Questi file possono essere considerati più simili a "plug-in" per qualsiasi sistema si aspettino di provenire, non tanto quanto script indipendenti. Ad esempio, i file in /etc/rc*.d
entrata con nomi che finiscono in .sh
entrata provengono dal sottosistema dello script di avvio, non eseguiti, ed è documentato che questo è ciò che accadrà se si inserisce un file con tale nome in/etc/rc*.d
e quando è fatto è fatto apposta. La convenzione di denominare i file destinati ad essere acquistati anziché eseguiti in questo modo è seguita anche altrove, ma non universalmente.
È vero che i file destinati ad essere acquistati in questo modo devono occuparsi delle impostazioni che potrebbero essere presenti nell'ambiente del chiamante che potrebbero influenzare il comportamento della shell, ma il protocollo concordato dovrebbe idealmente promettere un ambiente di esecuzione prevedibile.
shell_state=$(set +o)
... sceneggiatura ...eval "$shell_state"