在shell脚本中使用只读变量

时间:2012-11-15 19:24:45

标签: linux bash shell unix

在可能的情况下使用只读变量或者它有任何缺点是不是很好的shell编程实践?例如。如果我想编写一些包含多个使用不可变文件路径的脚本文件的脚本,那么声明这样的路径是否有意义:

readonly LOGS
export LOGS 
LOGS="/some/path"

另一个问题:将单片和冗长的读取shell脚本代码拆分成单独的文件是一个好主意吗? 非常感谢你的回答。

4 个答案:

答案 0 :(得分:12)

听起来你可能会认为readonly比实际做的更多。首先,readonly状态不会导出到环境中或由子进程继承:

$ declare -rx LOGS=hello
$ LOGS=goodbye
bash: LOGS: readonly variable
$ bash -c 'echo "$LOGS"'
hello
$ bash -c 'LOGS=goodbye; echo "$LOGS"'
goodbye
$ 

答案 1 :(得分:5)

一般来说,使用只读变量(使用任何语言)和模块化程序(使用任何语言)都是一件好事。

只读变量可以防止常见的错误来源,并有助于提高可读性和可维护性。知道你可以依赖变量的值使你能够更好地推理你的程序,并在以后对该变量做出假设 - 如果变量是可变的,你就不能做的事情。

模块化提高了可维护性和可重用性。更多模块通常意味着可以在不同情况下重复使用的更细粒度的单元,更易于阅读的更短代码,以及如果您的模块是独立的,可以破坏修改的部件之间的交互更少。

答案 2 :(得分:5)

只读变量的经典用法是TMOUT。将此变量设置为非零值将在TMOUT秒不活动(即无键盘输入)后注销交互式终端会话。要阻止智能用户覆盖设置,请使用readonly

readonly TMOUT=60

完成此操作后,无法做到:

export TMOUT=0

答案 3 :(得分:2)

我不认为bash中的readonly变量是有用的。我想不出任何我已经看过的问题可以通过变量readonly来防止。这种限制违背了bash的动态性质。还有其他更常见的问题原因(例如拼写错误或忘记将变量声明为本地变量)无论如何都无法阻止。

如果你想分开一些东西,试着只拆分“功能”,而不仅仅是分割代码块。如果您知道“source~ / myscript.sh”实际上没有做任何事情,那么重用一个小东西会更容易。