要在 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
不可知的:
wget -O - https://raw.githubusercontent.com/<username>/<repo>/<branch>/<path>/<file> | bash
答案1
您无法使用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
这个例子仅用3秒的时间来演示解决方案;您可以根据需要选择延迟。
行动中:
Now x=100
Now x=100
Now x=100
Now x=
Now x=
Now x=
您可以轻松地使其成为一行;
...
答案2
当然:
trap 'unset x; trap - USR1' USR1; { sleep 5m; kill -USR1 $$; } &
这会在 USR1 信号上设置一个陷阱,然后(用分号作弊将其放在一行上)将 sleep 和 Kill 命令组合到后台作业中。当该作业完成时,它将向当前 shell 发送 USR1 信号,该 shell 将执行陷阱。陷阱会解除x
,然后清除陷阱。
没有功能!
答案3
对于您修改后的问题,基于命令行而不是脚本,您最简单的解决方案是使用子外壳做你的工作。
例如
$ bash
$ x=100
$ echo $x
100
$ exit
$ echo $x
$
bash
您在运行和调用该 shell之间设置的所有变量都exit
将被忘记。
这与该部件的工作方式非常接近wget ... | bash
,除了您可以剪切“粘贴”/键入命令。
答案4
实际上,最简单的方法可能是仅使用在开头带有变量声明的复合命令。
如果在命令行开头声明变量,则仅在该命令的范围内临时定义该变量。
madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y bash -c 'echo $x'
y
madumlao@lezard:~$ echo $x
foo
正如您所看到的,带有变量声明的行仅在该行的环境中设置变量。
请注意,以下内容将不起作用:
madumlao@lezard:~$ x=foo
madumlao@lezard:~$ x=y echo $x
madumlao@lezard:~$ echo $x
foo
第二行中的 $x 是在命令行解析期间解析的,在实际赋值之前,所以它意外地为空!