要在 Bash 中声明一个变量,例如在 Bash 脚本文件(不包括 Bash 函数)中,我会这样做x=y
,当我在该脚本文件中使用它时,我会这样做unset x
。
有没有办法(不使用函数)在 5 分钟后取消设置变量,都在一行中?一个合理的方法可能是x=y && echo "unset x" | at now + 5 minutes
。
在这种特殊情况下,我通过将其内容从 GitHub复制粘贴到终端来直接在终端中运行脚本文件。这属于我假设的采购范围”。
鉴于我使用 GitHub,另一种方法可能是直接从 GitHub 使用单独的 shell执行脚本文件的原始版本,bash
如下所示,但我不喜欢这种方式,因为它不能是user/repo/branch/path/file
-agnostic:
wget -O - https://raw.githubusercontent.com/<username>/<repo>/<branch>/<path>/<file> | bash
Run Code Online (Sandbox Code Playgroud)
您不能使用at
作业,因为它们在不同的上下文中运行,并且不能影响当前的 shell。
但是我们可以做一些类似的事情。此代码将触发警报信号,我们可以捕获并对其执行操作
#!/bin/bash
x=100
trap 'unset x' SIGALRM
mypid=$$
( /bin/sleep 3 ; kill -ALRM $mypid) &
for a in 1 2 3 4 5 6
do
echo Now x=$x
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
这个例子只有 3 秒长的时间来演示解决方案;您可以根据需要选择延迟。
在行动:
Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将其与;
...
当然:
trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &
Run Code Online (Sandbox Code Playgroud)
这会在 USR1 信号上设置一个陷阱,然后(用分号欺骗将其放在一行)将 sleep 和 kill 命令组合到后台作业中。当该作业完成时,它将向当前 shell 发送 USR1 信号,后者将执行陷阱。陷阱解除设置x
,然后清除陷阱。
没有功能!