As Richard Pennington says, il modo giusto per farlo è quello di avere
#!/bin/bash
come la prima riga dello script.
Ma questo non aiuta se gli utenti lo invocano utilizzando sh
esplicitamente. Per esempio, se digito
sh your-script-name
la linea #!
verrà ignorato.
Non è davvero può impedire alle persone di fare questo, ma si può scoraggiarlo con l'aggiunta di qualcosa di simile alla parte superiore dello script:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
echo "Please do not use sh to run this script ($0), just execute it directly" 1>&2
exit 1
fi
Oppure si potrebbe fare qualcosa di simile:
#!/bin/bash
if [ ! "$BASH_VERSION" ] ; then
exec /bin/bash "$0" "[email protected]"
fi
ma che potrebbe andare molto male molto facilmente; ad esempio, probabilmente non è garantito che $0
, che normalmente è il nome dello script, sia effettivamente un nome che puoi usare per invocarlo. Posso immaginarlo andando in un loop infinito se sbagli o se il tuo sistema è leggermente mal configurato.
Suggerisco l'approccio del messaggio di errore.
(Nota: ho appena curato questa risposta in modo che il messaggio di errore include il nome dello script, che potrebbe essere utile per gli utenti.)
fonte
2013-07-19 17:41:39
@shellter: Credo che si intende '/ usr/bin/env ', non'/bin/env'; il mio sistema, per esempio, non ha '/ bin/env'. Vedi anche [questa domanda] (http://unix.stackexchange.com/q/29608/10454) e [la mia risposta] (http://unix.stackexchange.com/a/29620/10454). –
Credo che questa domanda sia utile e potrebbe ancora rispettare le regole, ad es. non off-topic, se è stato riformulato solo in "Come posso modificare il mio script per forzarlo a eseguire in bash invece di sh?" (praticamente uguale al titolo) – Programster