私のスクリプトは、次のようにサブシェルコマンドを実行します。
( while ..... ) $3>$testdir/$testfile.log
エラーが発生します。
line 75: syntax error near unexpected token `$3'
line 75: ` ) $3>$testdir/$testfile.log'
いくつかのオプションを試してみましたが、>
変数ではなくハードコーディングされた数字である場合にのみ満足しているようです。かっこが抜けましたか?
答え1
あなたは正しいです。シェル構文は次のようなものだけを受け入れます。
「#>」
#
1桁の数字はどこにありますか?
シェルは複数の数値をサポートできますが、POSIXはこの動作を指定しません。
ここで変数拡張を実行できることは、指定された構文をはるかに上回ることです。
ただし、eval
拡張テキストを使用してパーサーを再度呼び出すことはできます。
答え2
シェル構文は制限されています。リダイレクトは、リダイレクト演算子の直前にある1桁の数字でのみ表すことができます。複数の数字、中間スペース、または変数拡張による数字を含めることはできません。
ファイル記述子番号が変数にある場合は、eval
リダイレクトを実行するシェルコードフラグメントにリンクできます。ほとんどのスクリプトをeval
文字列に入れたくない場合は、組み込みexec
関数を使用してリダイレクトを実行してください。たとえば、ハードコードされたファイル記述子番号を持つコードの場合
( … ) 3>foo
その後、このコードを使用して、変数が表すファイル記述子にリダイレクトできますfd
。
( eval "exec $fd>foo"; … )
1この拡張をサポートする特定のシェルでのみ使用できます。