変数 ( while .... ) のサブシェルリダイレクトエラー $3 > $testdir/$testfile.log

変数 ( while .... ) のサブシェルリダイレクトエラー $3 > $testdir/$testfile.log

私のスクリプトは、次のようにサブシェルコマンドを実行します。

 ( 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この拡張をサポートする特定のシェルでのみ使用できます。

関連情報