2015年6月23日火曜日

Posted by mattintosh | File under : ,
今まではスクリプトの先頭に #!/bin/bash と書いていました。 カレントシェルが bash の場合、実行権限を付与してスクリプトを直接実行すると正しい結果が得られます。 先ほどのスクリプトを bash 以外のシェルで実行してみます(ここでは zsh を使用していますが ksh などでもかまいません)。${BASH_VERSION} は実行するシェルが bash の場合に設定されている変数であるため、それ以外のシェルでは何も表示されません。
今度はシェバンのシェルのパスを書き換えてみます。 ファイル名のみで実行してみると何も表示されないことがわかると思います。 今度は同じファイルを bash で実行してみます。これはバージョンが表示されます。 実行方法やシャバングなどの関係を以下にまとめてみました。
シェル 実行方法 実行権限 シェバン 実行シェル
bash      ./gistfile1.sh なし bash
     ./gistfile1.sh #!/bin/bash /bin/bash
     ./gistfile1.sh #!/bin/sh /bin/sh
bash ./gistfile1.sh 不要 なし bash
bash ./gistfile1.sh 不要 #!/bin/bash bash
bash ./gistfile1.sh 不要 #!/bin/sh bash
sh   ./gistfile1.sh 不要 なし sh
sh   ./gistfile1.sh 不要 #!/bin/bash sh
sh   ./gistfile1.sh 不要 #!/bin/sh sh
sh      ./gistfile1.sh なし sh
     ./gistfile1.sh #!/bin/bash /bin/bash
     ./gistfile1.sh #!/bin/sh /bin/sh
bash foo.sh のように実行した場合、シェバンによるシェルの指定は無視されます。例えば、ソースファイルに含まれる configure などのスクリプトを実行するときに #!/bin/sh が記述されたものに対して zsh configure として実行すると正しく動作しないかもしれません。

0 コメント:

コメントを投稿