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