次のシェルスクリプトの動作を理解する必要があります。
#!/bin/bash
echo "First more"
more $1
echo "First echo"
echo $1
echo "Second more"
more $1
次のコマンドを実行するとき:
echo dir1 | bash script.sh
私は次のような結果を得ます。
First more
dir1
First echo
Second more
なぜecho
そして2番目にmore
アクセスできないコンテンツですか$1
?
次のコマンドを実行するとき:
echo dir1 | bash script.sh dir2
私は次のコマンドを取得します
First more
dir1
*** dir2: directory ***
First echo
dir2
Second more
*** dir2: directory ***
dir2
すべてのコマンドに渡されますが、多くは印刷されますが、ディレクトリdir1
と見なされます。dir2
ベストアンサー1
パラメータと標準入力を混同しています。データをプログラムにパイプすることは、コマンドライン引数を提供することとは異なります。
最初のケースでは、スクリプトにパラメータを渡さずに標準入力ストリームを介してデータを供給するだけです。したがって、$1
スクリプト全体の期間中は設定されません。したがって、
最初の呼び出しではmore
引数を使用せずに標準入力をページングします。これにより、(dir1
、テキストで)パイプした内容が表示されます。次の項目はecho
印刷する内容がないため、新しい行だけを印刷し、最後の項目more
も印刷する項目はありません。標準入力は最初の入力によって「使い果たされた」。
2番目のケースでは、パラメータを渡します。スクリプトの$1
値も同じです。dir2
最初の2つを除いて同じことが起こりますmore
。
- 2つの標準入力によるページング
- ファイルをページングしようとしていますが、ディレクトリなので
dir2
エラーが発生します。
$1
echoはincludedir2
と最後のmore
エラーで予想どおりに実行しますdir2
。標準入力から何も読みません。