独自の変数スコープを使用して、bashまたは他のsh派生シェルのコマンドラインからフォアグラウンドでコマンドリストを実行できます(したがって、そのスコープ内の変数に割り当てられているすべての値は、スコープの外側ではわかりません)。そして - バックグラウンドコマンドが生成された場合 - バックグラウンドコマンドはまだ親シェルの下のタスクですか、つまりまだコマンドラインシェルのタスク制御下にありますか?これを行う方法が2つ以上ある場合、実際に最短の方法は何ですか?
括弧を使用すると、独自の範囲を持つ新しいサブシェルが作成されますが、生成されたすべてのバックグラウンドコマンドはシェルのジョブ制御に属していないことを理解しています。
答え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
関数ローカルスコープをサポートするすべてのシェルでは、次の一般的な関数を使用できます。
run() { eval "$@"; }
それから:
run 'local t; for t in 100 200 300; do sleep "$t" & done'