【发布时间】:2018-05-05 08:03:33
【问题描述】:
我正在尝试在我的 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 命令什么也没发现。
【问题讨论】:
-
顺便说一句,
(( $# )) && printf '%q\n' "$@"是在 bash 中列出命令行参数的更可靠的方法。使用echo $@(或其精确但不必要冗长的等效echo ${@}),您无法区分yourscript foo bar和yourscript "foo bar";此外,由于缺少引用,yourscript '*'将让echo $@发出文件列表,而不是*字符;echo "$@"会解决这个问题,但会留下其他未解决的问题。 -
(另外,从脚本中获取
/etc/profile通常是一种不好的形式——让你的脚本依赖于主机本地配置会使它们根据定义变得不可移植)。 -
提示:考虑通过shellcheck 运行具有令人困惑行为的脚本。在这种情况下,它会自动标记this issue
-
@FreakyDan :请查看 SHELL BUILTIN COMMANDS 部分中
set命令的bash 手册页:首先,设置选项由set -o NAME VALUE完成。其次,bash 中没有 autologout 选项。
标签: linux shell centos command-line-arguments