2013-07-19 15 views
6

Sono stato in giro cercando di trovare questo, ma non ho potuto trovare nulla di mano. Sono sicuro che la risposta è semplice.Esiste un modo per forzare l'esecuzione di uno script di shell in bash anziché in sh?

Sto scrivendo alcuni script di shell per vari scopi per essere eseguiti da persone diverse, e alcuni di essi potrebbero invocare lo script con "sh" invece di "bash".

Lo script contiene strumenti che non funzionano nell'ambiente di shell regolare e hanno bisogno di bash. C'è un modo per forzare lo script da eseguire in bash anche se è stato richiamato con "sh"?

+0

@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). –

+0

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

risposta

24

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.)

+0

Grazie per la risposta. Ho la riga specificata in alto e non sapevo di poter controllare le versioni di bash per generare un errore. Questo andrà bene, grazie! – Locane

+0

Spesso, altre shell (come ksh o zsh) potrebbero funzionare. Si potrebbe voler controllare anche per loro. – Demi

2
#! /bin/bash 
# The rest of your script. 
Problemi correlati