シェルスクリプトとパイプの動作の説明

シェルスクリプトとパイプの動作の説明

次のシェルスクリプトの動作を理解する必要があります。

#!/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エラーが発生します。

$1echoはincludedir2と最後のmoreエラーで予想どおりに実行しますdir2。標準入力から何も読みません。

おすすめ記事