【问题标题】:Why does sourcing a script with "set var = value" break $@?为什么使用“set var = value”获取脚本会破坏 $@?
【发布时间】: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 baryourscript "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


【解决方案1】:

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

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

autologout=30

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

【讨论】:

    猜你喜欢
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    相关资源
    最近更新 更多