在作业控制下单独的变量范围生成命令

在作业控制下单独的变量范围生成命令

可以在 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'

相关内容