2013-10-23 16 views
13

私はbashスクリプトを持っており、bashが必要です。shを使ってbashスクリプトを実行する

もう一人は

sh script_name.sh 

でそれを実行しようとshのは、彼のディストリビューションにダッシュするシンボリックリンクがあるので、それは失敗します。

#!/bin/sh 
bash script_name.sh 

目標は、ダッシュへのシンボリックリンクを持つシステムでのbashとshので.SHスクリプトを実行することです:

$ ls -la /bin/sh 
lrwxrwxrwx 1 root root 4 Aug 25 16:06 /bin/sh -> dash 

私はラッパースクリプトを使用するためのアイデアを持っています。

if [ "$BASH" != "/bin/bash" ]; then 
    echo "Please do ./$0" 
    exit 1 
fi 

以上の一般的な方法は$BASH_VERSIONを使用している:

まあ
if [ -z "$BASH_VERSION" ]; then 
    echo "Please do ./$0" 
    exit 1 
fi 
+0

もし '。/ script_name.sh'だけすればどうなるでしょうか? – fedorqui

+2

他のユーザーに 'bash script_name.sh'を実行させますか? - ラッパーも機能します。あなたの質問は何ですか? – John3136

+0

スクリプトを表示する必要があります。あなたが望むのは、スクリプトがPosix 'sh'標準に厳密に従うようにスクリプトを変更することです。 –

答えて

25

、通常、あなたが伝えるためにshebangを使用

他にあなたは何もする前に、あなたのスクリプトで
+0

しかし、これはユーザーが 'sh script.sh'を実行するのを妨げません。 – jbr

+0

@jbr:right私はいくつかのコードを追加しました。あなたのために+1してください。 – neuro

+0

@neuroスクリプトに渡されるパラメータを含めるようにあなたの例を修正しました。 – devnull

4

、あなたのような何かを行うことができます正しいインタプリタを使用するシェル:

#!/bin/bash 

# your script here 

あなたはhav

chmod +x my_script.sh 

を、ユーザーがでそれを起動してみましょう:実行可能にスクリプトを設定するための電子ラッパースクリプトを使用するよりも、

./my_script.sh 

それは簡単なようです。

あなたも、ユーザーの利用SH /ダッシュや通訳などの任意のshの場合はbashでスクリプトを実行するために、JBRのテストを使用することができます。

#!/bin/bash 

if [ -z "$BASH_VERSION" ] 
then 
    exec bash "$0" "[email protected]" 
fi 

# Your script here 

それが正しくどちらかで動作します。この方法は:

sh ./my_script.sh 

# or 

bash ./my_script.sh 

# or 

./my_script.sh 
+0

私は 'if [! "$ BASH"];はもっと良いアプローチかもしれません。 – devnull

+0

いいえ、sh互換性のためにbashが使用されている場合、 '$ BASH'は'/bin/sh'かもしれません。 – jbr

+0

'/ usr/bin'に' bash'があったのはどうでしょうか? – devnull

関連する問題