![在作业控制下单独的变量范围生成命令](https://linux22.com/image/217714/%E5%9C%A8%E4%BD%9C%E4%B8%9A%E6%8E%A7%E5%88%B6%E4%B8%8B%E5%8D%95%E7%8B%AC%E7%9A%84%E5%8F%98%E9%87%8F%E8%8C%83%E5%9B%B4%E7%94%9F%E6%88%90%E5%91%BD%E4%BB%A4.png)
可以在 bash - 或其他 sh 衍生 shell - 中从命令行在前台运行具有自己的变量范围的命令列表(因此分配给该范围内的变量的任何值在该范围之外都不会被知道),而且 - 如果生成后台命令 - 该后台命令仍然是父 shell 下的作业,即仍在命令行 shell 的作业控制下?如果有不止一种方法可以做到这一点,哪一种方法实际上最短?
我知道使用括号将创建具有自己范围的新子 shell,但任何生成的后台命令将不再受 shell 的作业控制。
答案1
在 中zsh
,您可以使用匿名函数,但仍然需要将变量声明为local
。
例如:
$ () { local t; for t in 100 200 300; do sleep $t & done; }
[2] 4186
[3] 4187
[4] 4188
$ jobs
[2] running sleep $t
[3] - running sleep $t
[4] + running sleep $t
$ typeset -p t
typeset: no such variable: t
对于任何支持函数局部作用域的 shell,您可以使用普通函数,例如:
run() { eval "$@"; }
然后:
run 'local t; for t in 100 200 300; do sleep "$t" & done'