test と input1 の 2 つのファイルがあります。以下は私の「テスト」ファイルです:
echo $1 $2
出力の変更は、ターミナルに書き込むときと同じように機能します。
./test foo bar > input1
文字列「foo bar」がinput1に書き込まれます。それでも、ターミナルに書き込むと:
./test < input1
端末に出力されるのはスキップされた行だけです。
「foo bar」が端末に出力されない理由はありますか?
これは、testが標準入力をエコーしないためです。コマンド引数をエコーします。
値$1
と$2
は、コマンド ラインの最初と 2 番目の引数を表し、テストがエコーするものです。
より小さい ("<") 表記は標準入力 (デフォルトでは、対話型シェルのコンソール) をリダイレクトし、testに送信された標準入力をinput1から取得するようにリダイレクトしていますが、testは標準入力を調べません。コマンドライン引数のみを調べます。
シェルが期待どおりに動作するようにするには、input1の内容を取得し、それをtestに渡されるコマンド引数に入れる必要があります。
おそらくこれはあなたが意図したものです:
./test $(cat input1)
やりたいことをするには、次のことを行う必要があります。
./test `cat input1`
このように、input1 の内容は、標準入力としてではなく、引数としてコマンドに渡されます。
input1 の内容が次のとおりであるとします。
a b c
これは、スクリプトを次のように呼び出すのと同じです。
./test a b c
スクリプト内で、a、b、c を変数として受け取ります。
$# = 3
$1 = 'a'
$2 = 'b'
$3 = 'c'
しかし、input1 をスクリプト内の標準入力として使用したいとします。したがって、次のようにスクリプトを呼び出します。
./test < input1
スクリプト内で、input1 の内容を に渡したいとしますgrep
。次のようにします。
grep b <1
これにより、input1 ファイルで文字列 'b' が検索されます。
他の例を見るには、このページを見てください: http://www.mathinfo.u-picardie.fr/asch/f/MeCS/courseware/users/help/general/unix/redirection.html