是否可以在启动新 shell 期间“监听”变量的值?
我有一个脚本,用于检查典型位置中的 $PATH 变量,但我想尝试一些不同的东西。这是我的想法:
我不想仅仅猜测 $PATH 的设置位置,而是想通过运行名为“path-inspector”之类的命令在后台为用户生成一个新的 shell。path-inspector 为当前用户生成一个新的 shell 并监听 $PATH 变量。也许它首先将 $PATH 设置为空字符串,但只要修改了 $PATH,该命令就会回显修改 $PATH 的文件名和行号。这就像设置断点并专门为 $PATH 设置调试器一样。
我仍然觉得自己还处于一个不太清楚如何实现这一目标的阶段。以下是我意识到需要解决的问题:
- 子 shell 无法导出变量回到父母身边所以我需要设计一种方法来回应或报告结果。
- 我不知道有任何内置函数可以“监听”变量,所以我也需要一种方法来解决这个问题。是否可以在新 shell 中运行每个命令之前和/或之后注入命令来回显或发送输出?
- 环境变量不只是这些全局变量,它们是为每个 shell 创建的,更具体地说,对于每个过程。它们会很相似,但我至少需要知道,例如,非交互式 shell 可能没有与登录 shell 相同的 $PATH。因此,如果命令创建了“子 shell”,它可能会或可能不会使用与普通登录 shell 相同的设置。
- 不同的 shell。bash、sh、zsh、fish 等。
我愿意接受任何形式的反馈:“这已经完成了”,“这是不可能的”,或“你还需要了解这一点”等等。
答案1
ksh
实际上实现了一个很棒的功能,叫做discipline functions
它基本上允许你将回调附加到设置或引用变量:
$ cat t.sh
#!/bin/ksh
PATH=
function PATH.set
{
echo "new PATH in ${.sh.file}:${.sh.lineno}:"
echo " old = [${PATH}]"
echo " new = [${.sh.value}]"
}
PATH=/bin:/usr/bin:/sbin:/usr/sbin
PATH=$PATH:$PATH
。
$ ./t.sh
new PATH in t.sh:12:
old = []
new = [/bin:/usr/bin:/sbin:/usr/sbin]
new PATH in t.sh:13:
old = [/bin:/usr/bin:/sbin:/usr/sbin]
new = [/bin:/usr/bin:/sbin:/usr/sbin:/bin:/usr/bin:/sbin:/usr/sbin]
类似地,每次被引用PATH.get
时都会执行。$PATH
不幸的是,由于您似乎无法在中导出函数ksh93
,这会将回调限制在当前脚本中,从而限制其整体实用性。