2017-09-22 15 views
0

オプションの標準入力を受け取るシェルスクリプトを作成しています。私は以下のコードのスニペットを持っています。 $ {file}は、すべてのファイル名のリストを含むtxtファイルに書き込まれた単なるfileNameです。この場合の$ 2は別のプログラム(シェルスクリプトも)です。Bash文字列に特殊文字 '<'が付いている問題?

 if [ -f ${file}.in ]; then #if ${file}.in exists in current directory 

       stdIn="< ${file}.in" #set optional stdIn 

     fi 
     if ! [ -f ${file}.args ]; then #if ${file}.args does not exist in curr directory 

       $2 $stdIn > ${file}.out #run the $2 program with the optional standard input and redirect the output to a .out file 

何らかの理由で、 '<'文字が正しく解釈されません。私は

$2 < $stdIn > ${file}.out 

にラインを変更し、STDIN変数から「<」を削除した場合、これが正常に動作します。しかし、私はコードの残りの部分に大きな変更を加えなければならないので、そうしたくありません。私の現在のコードで何がどのように問題を解決するかは、誰でも知っていますか?どうもありがとう。

+1

読みくださいhttp://mywiki.wooledge.org/BashFAQ/050とhttp://mywiki.wooledge.org/BashParser、ここでの問題は、リダイレクトは、変数展開の前に起こることなので、 '<'特別なものではなく、ちょうど別の文字です。 –

答えて

2

<演算子を変数に格納することはできません。代わりに、stdInに格納されているファイル名から入力を無条件にリダイレクトし、/dev/stdinに初期化して、他の入力ファイルが適切でない場合は標準入力から読み込むだけです。

stdIn=/dev/stdin 

if [ -f "${file}.in" ]; then 
    stdIn="${file}.in" #set optional stdIn 
fi 
if ! [ -f "${file}.args" ]; then 
    "$2" < "$stdIn" > "${file}.out" 
fi