直接调用bash或通过软链接调用bash的不同结果

直接调用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 定义ofbreak不包括它在case块内的使用。

man页面还指出(根据 的定义case):

如果;;使用运算符,在第一个模式匹配之后不再尝试后续匹配

POSIX 定义case说:

条件构造案例应执行对应于的复合列表第一几种图案的

所以底线是 - 你不需要在第一场比赛后停止breakcase

答案2

从 bash 手册页:

如果使用 sh 名称调用 bash,它会尝试尽可能模仿 sh 历史版本的启动行为,同时也符合 POSIX 标准。

与 C/C++ 相反,您不需要break在 shell 脚本中使用 switch/case 语句。

相关内容