2013-07-19 6 views
6

Szukałem, próbując to znaleźć, ale nie mogłem znaleźć niczego od ręki. Jestem pewien, że odpowiedź jest prosta.Czy istnieje sposób na wymuszenie działania skryptu powłoki pod bash zamiast sh?

Piszę skrypty powłoki do różnych celów, które mają być uruchamiane przez różne osoby, a niektóre z nich mogą wywoływać skrypt z "sh" zamiast "bash".

Skrypt zawiera narzędzia, które nie działają w zwykłym środowisku powłoki i wymagają bash - czy istnieje sposób na wymuszenie uruchomienia skryptu w bash, mimo że wywołano go za pomocą "sh"?

+0

@shellter: Myślę, że masz na myśli '/ usr/bin/env ', nie'/bin/env'; na przykład mój system nie ma '/ bin/env'. Zobacz także [to pytanie] (http://unix.stackexchange.com/q/29608/10454) i [moja odpowiedź] (http://unix.stackexchange.com/a/29620/10454). –

+0

Uważam, że to pytanie jest przydatne i może nadal być zgodne z regułami, np. nie poza tematem, jeśli został zmieniony na "Jak mogę zmienić skrypt, aby wymusić jego wykonanie w bashu zamiast sh?" (prawie tak samo jak tytuł) – Programster

Odpowiedz

24

As Richard Pennington says, właściwym sposobem na to jest mieć

#!/bin/bash 

jako pierwszej linii skryptu.

Ale to nie pomoże, jeśli użytkownicy użyją go wyraźnie, używając sh. Na przykład, jeśli podam

sh your-script-name 

linia zostanie zignorowana.

Nie naprawdę może zapobiec ludzi od robienia tego, ale można go zniechęcić dodając coś takiego na początku skryptu:

#!/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 

Albo można zrobić coś takiego:

#!/bin/bash 

if [ ! "$BASH_VERSION" ] ; then 
    exec /bin/bash "$0" "[email protected]" 
fi 

ale to może bardzo źle pójść; na przykład prawdopodobnie nie ma gwarancji, że $0, która jest zwykle nazwą skryptu, jest w rzeczywistości nazwą, za pomocą której można go wywołać. Mogę sobie wyobrazić, że dzieje się to w nieskończonej pętli, jeśli źle zrobisz lub twój system jest nieco źle skonfigurowany.

Polecam podejście do komunikatu o błędzie.

(Uwaga: Właśnie edytować tę odpowiedź więc komunikat o błędzie zawiera nazwę skryptu, który może być pomocny dla użytkowników.)

+0

Dziękuję za odpowiedź. Mam linię podaną na górze i nie wiedziałem, że mogę sprawdzić wersje bash, aby rzucić błąd. To będzie ładnie, dziękuję! – Locane

+0

Często mogą działać inne powłoki (takie jak ksh lub zsh). Możesz również sprawdzić je. – Demi

2
#! /bin/bash 
# The rest of your script. 
Powiązane problemy