Unix:为什么符号链接的shell解释器仍然具有原始解释器的效果?

问题描述 投票:0回答:1

在我的 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的值是一致的。

谢谢你。

shell unix symlink
1个回答
0
投票

来自文档

当作为

sh
调用时,Bash 在读取启动文件后进入 POSIX 模式。

这包括禁用进程替换等

bash
主义。

© www.soinside.com 2019 - 2024. All rights reserved.