任务很简单。我想在 bash 脚本中的提示符中添加一个倒数计时器,该脚本在我的 .bashrc 中定义为别名函数,以便在我需要时在后台运行(例如“countdown 60 &”)。因此,循环内部有一个“sleep 0.1”延迟,然后更新 PS1,直到它达到最终条件,即倒计时结束并触发简单的铃声。
PS1 = PS1 + [倒计时]
发生在我身上的情况是,env 变量只会在脚本结束时更新,而这并不能实现脚本的目的,即在提示中显示计时器的状态。我可以想象,脚本在运行时创建了调用上下文的副本,所以这可能是问题所在。
如何动态地将环境变量更新为全局调用上下文?
编辑:我正在使用另一种解决方法。写入 /dev/shm。
所以我写信给/dev/shm/<我的变量>将其用作共享内存空间(也可以使用 /tmp)并从那里读取。我猜 ENV 全局变量可供读取,但脚本会在内部进行复制(我相信是为了防止冲突),然后在完成该过程后写回绑定变量。
如果有人想特别了解如何从自定义变量的状态动态地改变提示读数,这里是我的脚本。
export PSbase=$PS1;
function countdown(){
date1=$((`date +%s` + $1));
while [ "$date1" -ge `date +%s` ]; do
echo $(date -u --date @$(($date1 - `date +%s`)) +%H:%M:%S) > /dev/shm/countdown;
sleep 0.1
done;
rm /dev/shm/countdown;
paplay <path_to_sound>;
}
function countdownToPS1 () {
if [ -f /dev/shm/countdown ]; then
export PS1="${PSbase%\$ } [$(cat /dev/shm/countdown)]$ ";
else
export PS1=$PSbase;
fi;
};
PROMPT_COMMAND="countdownToPS1"
用法是“倒计时 50 &”并在最后显示带有 [HH:MM:SS] 计时器的提示。这会计算秒数,因此如果我需要 4 分钟,则为“countdown 60*4 &”。然后每次我按下回车键时,PROMPT_COMMAND 都会被指示执行从 /dev/shm/countdown 读取的函数,并使用计时器的当前状态生成我的新提示。很好。您还可以将该函数包装到timer() { 倒计时 "$@" & }所以你可以用类型来出演计时器并且倒计时会一直在后台运行。
所以问题是我该怎么做,但只能使用 ENV 变量,并在脚本运行时直接写入更新它们,而不仅仅是复制。我想这是不可能的。
答案1
这根本不起作用:从当前 shell 启动的脚本只能修改其自己的环境,而不能修改其父 shell 的环境。