Bill R Asked: 2020-02-09 11:23:31 +0800 CST2020-02-09 11:23:31 +0800 CST 2020-02-09 11:23:31 +0800 CST 为什么 bashrc 中的只读 TMOUT 会导致登录时出现多条关于 TMOUT 为只读的消息? 772 在研究了 TMOUT 变量和各种建议后,我在 /etc/bashrc 文件中设置了以下内容: TMOUT=600 readonly TMOUT export TMOUT 现在,当用户登录 TMOUT 设置为 600 时,设置为只读并导出,但会发生此错误: -bash: TMOUT: readonly variable -bash: TMOUT: readonly variable 有什么建议么? linux bash 3 个回答 Voted Best Answer Uncle Billy 2020-02-09T13:23:10+08:002020-02-09T13:23:10+08:00 我猜这/etc/bashrc不止一次被采购——通过添加一个来调试它 echo "TMOUT=<$TMOUT>: ${BASH_SOURCE[*]}" 在你的任务之前行。 默认情况下, AFAIR/etc/bashrc不是来源,而是明确来自~/.bashrc,并且仅在类似 RHEL 的发行版上。 但是导出变量并将其设为只读并不像您显然期望的那样工作: (readonly FOO=33; export FOO; bash -c 'FOO=47') # no error 环境变量不知道 shell 的“只读”属性:这只在当前会话/脚本中很重要。 这意味着用户可以TMOUT通过简单地启动另一个 shell来绕过您的env -u TMOUT bash --norc. 将其设为只读只是一件麻烦事。 choroba 2020-02-09T11:58:03+08:002020-02-09T11:58:03+08:00 在某个地方,您试图分配给变量,但它现在是只读的。 您可以检查变量是否是只读declare的,如果它不是只读的,则只分配给它: declare -p TMOUT 2>/dev/null | grep -- '-r' >/dev/null || TMOUT=600 declare当尚未声明变量时,重定向会隐藏输出和错误消息。 Bill R 2020-02-10T13:12:26+08:002020-02-10T13:12:26+08:00 好的 - 比利叔叔的回应让我走上了解决这个问题的道路。似乎 /etc/profile 和每个用户的 .bashrc 文件都在获取 /etc/bashrc ,其中 TMOUT 变量被设置、导出并设为只读。通过消除对采购 /etc/bashrc 的额外调用,我有了一个解决方案。 感谢 choroba 和比利叔叔的帮助
我猜这
/etc/bashrc
不止一次被采购——通过添加一个来调试它在你的任务之前行。
默认情况下, AFAIR
/etc/bashrc
不是来源,而是明确来自~/.bashrc
,并且仅在类似 RHEL 的发行版上。但是导出变量并将其设为只读并不像您显然期望的那样工作:
环境变量不知道 shell 的“只读”属性:这只在当前会话/脚本中很重要。
这意味着用户可以
TMOUT
通过简单地启动另一个 shell来绕过您的env -u TMOUT bash --norc
. 将其设为只读只是一件麻烦事。在某个地方,您试图分配给变量,但它现在是只读的。
您可以检查变量是否是只读
declare
的,如果它不是只读的,则只分配给它:declare
当尚未声明变量时,重定向会隐藏输出和错误消息。好的 - 比利叔叔的回应让我走上了解决这个问题的道路。似乎 /etc/profile 和每个用户的 .bashrc 文件都在获取 /etc/bashrc ,其中 TMOUT 变量被设置、导出并设为只读。通过消除对采购 /etc/bashrc 的额外调用,我有了一个解决方案。
感谢 choroba 和比利叔叔的帮助