我有一个 shell 脚本,没有指定用于解释命令的 shell 类型的第一行。
这个 .sh 文件一直在 SCO Unix 5 系统上使用,直到迁移到更现代的系统(如 RHEL 7)上为止。
在我看来,sh 是 SCO Unix 中的默认 shell,而 bash 是 Red Hat Linux 中的默认 shell,所以我认为将脚本移植到 linux 并运行它,这个脚本将默认使用 bash 进行解释。
说到点子上,在这个脚本中有一个像这样的部分:
MY_SETUP=1
echo $MY_SETUP
MY_SETUP=2 export MYSETUP
echo $MY_SETUP
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,导出命令后的变量名称不是赋值中的名称(这是一个输入错误)。
我注意到如果脚本是由 sh 或 bash 解释的,则此部分之后 MY_SETUP 变量的值是不同的。
sh MY_SETUP 值 = 2
bash MY_SETUP 值 = 1
bash 似乎完全忽略了与 export 命令内联的赋值并保留了以前的值。
所有这些运行都没有返回任何错误,所以我想知道为什么会有不同的行为。有人可以解释我吗?
编辑:
来自 Stéphane Chazelas 的回答似乎在 bash 这个指令中
var=x export var
Run Code Online (Sandbox Code Playgroud)
不设置“x”值也不导出它,但在我的环境中它两者都做。我糊涂了。
您似乎检测到了 POSIX 偏差,bash
这也是与历史悠久的 Bourne Shell 的偏差。您可以将其称为错误或只是偏离行为。
您引用的脚本打印
1
2
Run Code Online (Sandbox Code Playgroud)
与默认行为中除 bash 之外的所有 shell 一起使用。
如果你打电话bash --posix
,它就能正常工作。
从用户 Kusalananda 的指针看来,bash 默认情况下使所有内置命令在退出时恢复其临时环境,而不仅仅是非特殊内置命令。自从export
它是一个特殊的内置程序,POSIX 要求 shell 的行为与 20 世纪 80 年代初的 Bourne Shell 相同,以保持环境值。
由于 bash 默认情况下不实现这一点,因此您会得到偏差。
归档时间: |
|
查看次数: |
1210 次 |
最近记录: |