bashを直接呼び出すか、ソフトリンクを介して呼び出すと結果が異なります。

bashを直接呼び出すか、ソフトリンクを介して呼び出すと結果が異なります。

私のRed Hat Linuxシステムに/bin/shリンクがあります。bash

$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Sep 27 13:17 /bin/sh -> bash

この設計されたテストプログラムを直接実行すると、期待した回答が得られました。

$ cat ./test.sh
#!/bin/sh
# Just a test program to illustrate an issue
case "b" in
    (a)   echo "a"; break;;
    (b)   echo "b"; break;;
    (c)   echo "c"; break;;
esac

$ ./test.sh 
b

ただし、明示的に実行またはbash呼び出す最初の行を変更するとbashエラーが発生します。私はこれがおそらく本当のバグであるbashことを知っています。しかし、なぜこのような違いはありますか?

$ /bin/bash ./test.sh
b
./test.sh: line 5: break: only meaningful in a `for', `while', or `until' loop

$ sed -e 's/sh/bash/' test.sh > test1.sh
$ chmod 777 test1.sh
$ ./test1.sh
b
./test1.sh: line 5: break: only meaningful in a `for', `while', or `until' loop

ベストアンサー1

manページからbash

名前でbashを呼び出すとシェン、履歴バージョンの開始動作を模倣しようとします。シェンPOSIX規格を維持しながらできるだけ近い。

でもそう言うと、POSIXの定義ofにはブロック内での使用はbreak含まれません。case

このmanページには、次のような内容も記載されています(の定義に従ってcase)。

もし;;;演算子を使用すると、最初のパターンマッチングの後に後続のマッチングが試行されなくなります。

そしてPOSIXの定義言ったcase

条件付き構成ケースでは、次の対応する複合リストを実行する必要があります。最初複数のパターン

したがって、結論は、最初のゲームが終了した後に停止する必要はないということですbreakcase

おすすめ記事