为什么采购带有 "set var = value" 的脚本会中断 $@?

Why does sourcing a script with "set var = value" break $@?

我正在尝试在我的 Centos VM 上配置自动注销。我注意到,如果我在 /etc/profile.d/autologout.sh 创建一个文件,文件中只有 set autologout = 30,那么它会中断任何来源 /etc/profile 的脚本的传递参数。

显示此内容的示例脚本是:

#!/bin/bash 
source /etc/profile 
echo ${@}

当我 运行 它时,脚本只看到参数 "autologout 30" 而它没有得到任何参数我在 运行 时试图传递它。

无论自动注销脚本的名称、属性 的名称如何,或者如果我有 set autologout 30,都会发生这种情况。

有人可以解释一下发生了什么吗?就好像 autologout.sh 正在劫持参数。我对正在发生的事情一头雾水,研究 profile.d 并且设置命令没有任何结果。

set 不用于修改符合 POSIX 的 shell 中的 shell 变量。相反,当给定位置参数时,它会修改命令行参数列表。

如果您只想为变量赋值,请不要使用set。相反,您的文件应该只包含:

autologout=30

...并且 "$@" 将保持其原始状态。