2017-04-14 15 views
3

bashスクリプトを書くときに問題が発生しました。私は2つの方法で呼び出すことができるスクリプトを書く必要がありました、ファイルを読むか、標準入力を読みます。しかし、私が読んでいる間は、標準入力を読むことができなくなりました。ここに私のコードは次のとおりです。ファイルを読むか標準的なユーザー入力を読む

#!/bin/bash 
FILE=$1 
while read LINE; 
do 
    echo "$LINE" | tr " " "\n" | tr "\t" "\n" 
done < $FILE 

答えて

3

問題は、あなたが常にあなたの読み取りへの入力としての$ FILEを与えるという事実から来ています。 引数を持っているときにファイルをチャネル0にリダイレクトして、それ以外の場合はstdinにしておくことができます。

#!/bin/bash 
FILE=$1 
if [ ! -z "$FILE" ] 
then 
    exec 0< "$FILE" 
fi 
while read LINE 
do 
    echo "$LINE" | tr " " "\n" | tr "\t" "\n" 
done 

exec 0< "$FILE"リマインダーチャネル0の入力として$ファイルを使用するようにシェルに指示します:デフォルトread聴取することにより、0

0<をチャンネルには0はチャネル0を示し、<がこれを示してここで重要であり、入力です。引数がない場合、exec 0< "$FILE"で、は呼び出されません。この場合、チャネル0はstdinを使用します。

+0

のようなツールを呼び出すことができます

file="${1}" if [ "${file}" = "-" ] ; then file=/dev/stdin # special device for stdin fi while read -r line ; do do something done < "${file}" 

、私は「チャネル0」と言う傾向にあるが、Bashのために正確な用語は、「ファイルディスクリプタ0」であります。 'lsof -a -p $$ -d0'で現在のfd0を確認することができます。 – vdavid

+0

ありがとうございました。私はちょうど今のところnoobです。 –

2

UNIXツールでは、入力が標準入力から来ることを示す特別なファイル名-を使用します。あなたはそれを適応させることができます:あなたは今ちなみにこの

tool -    # reads from terminal 
cmd | tool -  # used in a pipe 
tool /path/to/file # reads from file 
+0

答えをくれてありがとう、私はそれを試し、さらにbashに関するいくつかの調査をします。私はまだこの言語の初心者です:) –

+0

合意 ' - 'は通常stdinとして扱われます。しかし、 '/ dev/stdin'は意図した通りに動作しないケースが多いので、避けてください。 '-'を強制することで、スクリプトはパイプから読み込むことができません。 – vdavid

+0

場合によっては、 'file = $(

関連する問題