これが不可能な理由は何ですか、それを解決するための最良の方法は何ですか?
#!/bin/sh
desc=5; file=/etc/passwd
exec "$desc"<"$file" #the variable filedescriptor is the problem
私はむしろしませんeval
。
答え1
まあ、なぜこれができないのかについては、次のようにしたくありません。
echo "$text">file
$x
数値の場合、動作は停止します。
以下を行う必要があります。
eval 'exec '"$desc"'< "$file"'
シェルにexec 5< "$file"
コードを評価させます。eval
引数で拡張する必要がある部分だけを慎重に拡張する限り(そしてこれらの拡張は安全です)(ここでは、を除くすべての項目に二重引用符を使用してください$desc
)。間違いは、シェルに提供された内容をシェルコードとして評価することです。eval "exec $desc< $file"
$file
Passを使用すると、モジュールの組み込み関数をzsh
使用することもできます。sysopen
zsh/system
zmodload zsh/system
sysopen -u "$desc" -r -- "$file"
一緒zsh
にするbash
ksh93
exec {desc}>&-
次に保存したfdを閉じることが$desc
できます。
exec {desc}> file
シェルは10より大きいfdを割り当て、分配するはい。これは事前に保存されたfdを$desc
開くためには使用できません。file
$desc
これはexec >&"$desc"
あいまいさがないので動作することに注意してください。zsh
最新バージョンでは、stdoutとstderrをファイル(たとえば)にリダイレクトし、数値でない場合にのみ機能する演算子があることをbash
除いてください。>&
csh
echo something >& "$file"
$file