2016-06-02 6 views
0

bashの1、2、3などのファイルに複数のディスクリプタを作成しようとしています。
たとえば、exec 9>abc/1は問題なく動作しますが、forループで記述子を作成しようとすると、exec $[$i+8]>abc/$iのように動作しません。私はいろいろな方法で試しましたが、execは変数を受け入れないようです。私がしたいことをする方法はありますか?bash:ループ内に多くのディスクリプタを作成する

編集:そうでない場合は、記述子なしでflockを使用する方法がありますか?

+0

また、 '$ [expression]'は廃止された構文です。 '$((式))'に移動してください – anishsane

+1

'eval"を試してくださいexec $((i + 8))> abc/$ i "' – anishsane

答えて

0

はい、execは、ファイル記述子番号の変数を受け入れません。コメントで指摘したように、あなたは$i1であれば、これらの複雑な引用符は、そのEVAL-EDを確保

exec 9>"abc/$i" 

に相当し、その後のexec-edコマンドでも安全である、

eval "exec $((i + 8))>"'"abc/$i"' 

を使用することができますファイル名がabc/1以外に変更された場合。

しかしthere is警告:彼らは、ファイルと競合する可能性として9より大きいファイル記述子を使用して

リダイレクトは、注意して使用する必要があるシェルは内部的に使用しています記述子。

あなたのタスクは、連続したファイルディスクリプタ番号を必要としないのであれば、あなたは自動的に割り当てられた記述子を使用することができます。

ファイルディスクリプタ番号が先行することができる。各リダイレクトではなく、言葉が先行することができます形式:{varname}。この場合、>&-<&-を除くリダイレ​​クション演算子ごとに、シェルは10より大きいファイル記述子を割り当ててvarnameに割り当てます。

ので、

exec {fd}>"abc/$i" 
echo "$fd" 

abc/1と印刷ファイルディスクリプタ番号(例えば10)に書き込むためのファイルディスクリプタ10(またはそれ以上)を開きます。

関連する問題