在我的 Unix 系统中,/bin/sh 符号链接到 /bin/bash。
/bin/sh -> bash*
在这种情况下,我希望如果可执行文件的 shebang 为:
#!/bin/sh
它将相当于:
#!/bin/bash
然而,事实并非如此。 例如,下面的代码使用仅 bash 支持的进程替换:
#!/bin/bash
echo ${BASH_VERSION}
diff <(echo -e "1\n2") <(echo -e "2\n2")
结果:
4.2.46(2)-release
1c1
< 1
---
> 2
如果我将shebang更改为/bin/sh,如下:
#!/bin/sh
echo ${BASH_VERSION}
diff <(echo -e "1\n2") <(echo -e "2\n2")
结果是:
4.2.46(2)-release
test.sh: line 3: syntax error near unexpected token `('
test.sh: line 3: `diff <(echo -e "1\n2") <(echo -e "2\n2")'
此外,即使删除 shebang,并显式运行脚本:
/bin/sh test.sh
我也遇到同样的错误。
奇怪的是(或者可能不是),运行以下命令会起作用:
`realpath /bin/sh` test.sh
我正在寻找这种行为的解释 - 因为这在我的理解中是意想不到的,因为 /bin/sh -> bash。而且BASH_VERSION的值是一致的。
谢谢你。