识别用户定义的变量

识别用户定义的变量

在 GNU/Linux bash shell 中,我使用命令在特定时间点识别并保存所有用户定义的变量,以进行调试(稍后我会获取该文件):

declare | grep '^[[:lower:]]' | grep -v '^colors' | sort > ${output_dir}/env_variables.tmp

我知道这是不好的做法,因为我是“巧合编程”,相信所有系统变量(除了colors)都将以大写字母开头 - 我想想出一个更好的方法。

我还考虑过在运行脚本之前保存当前环境变量的一个版本,然后简单地将子 shell 中的环境变量与它进行区分。这看起来和我当前的尝试一样黑客,所以我想知道是否有一种方法可以按日期或用户定义过滤变量,或任何其他标准来识别由某个子 shell 新创建的变量?

答案1

不,无法按日期或所有者过滤变量。您可以将所有现有变量设置为只读,然后用于declare -p过滤掉这些变量。但解决这个问题的更常见方法是在所有 vairable 前面加上前缀__project_(其中项目是什么)。变量变得很长,但这似乎是最安全的方法。

您在启动时保存变量的想法一点也不坏。您可以仅保存名称

 declare |awk -F= '/=/ { print $1 }' >tmpfile.$$.shvars

或者回到只读的想法:

 while read var ; do declare -r var; done < tmpfile.$$.shvars

现在你声明你的,稍后,当你完成时:

 declare -p |awk '$2 !~ /^.r$/ { print $3 }' |cut -d= -f1

获取变量列表。缺点是,所有这些变量现在都是只读的,这是不应该的。

答案2

在 shell 中,当您设置变量(环境变量或未导出的参数)时,该新变量与之前已设置的任何变量之间没有区别。因此,您想到的两种解决方案(的变体)是:

  • 使用命名约定来描述您感兴趣的内容(大写与小写)
  • 拍摄前后快照

尽你所能。

相关内容