猫のドキュメントはこちら

猫のドキュメントはこちら

私はLinuxとシェルスクリプトに初めて触れ、基本を学びようとしています。私は現在ここでドキュメントを説明するリダイレクトの章を読んでいます。以下のコードがcatコマンドとどのように機能するかは実際には理解できません。誰でも教えてもらえたら?

cat << EOF
line1 
line2
line3
EOF

私はそれがどのように機能するかを正確に知っています<< EOF。キーワードは入力の終わりを示します。私の問題は、cat出力ストリームにコンテンツを印刷できるように、ファイル名を入力ストリームにインポートすることです。上記の仕組み内部?私たちはどこにもファイル名を指定しませんでした。シェルは内部的に一時ファイルを生成して供給しますかcat?私の質問が明確になることを願っています。

ベストアンサー1

コマンドラインにファイル名が指定されていない場合cat(またはファイル名がすぐに-)、標準入力から読み取りに切り替わります。

これは次のことを意味します。

cat <<END
something something
END

catファイル名が指定されておらず、標準入力ストリームに到着する文書から読み取られ続けることがわかります。

cat標準入力とファイルから読み取ることができます。

cat - filename <<END
something something
END

これにより、ここにある文書の内容がの内容にリンクされますfilename。パラメータの順序がある場合、filename -これはデータ接続の順序でもあります。

これは-シェルにとって特別なものではなく、catユーティリティ(および他のユーティリティ)によってのみ「標準入力」として解釈されます。-実行する必要がある物理ファイルがある場合をcat使用してください。cat ./-つまり、パスとともにファイル名を指定します。


すべての目的のために一時ファイルを生成し、標準入力ストリームに追加されたファイルを使用してユーティリティを呼び出すことによって、このドキュメントをユーティリティに直接供給することを検討できます。

printf 'some contents' >tmpfile
utility <tmpfile
rm -f tmpfile

ここでは、ドキュメントは実際にはこのように実装されていないかもしれませんが(FIFO(名前付きパイプ)かもしれません)、考えると完全に間違った方法ではありません。

ソースコードを読むと、bash特定のシェルはmkstemp()ライブラリ関数を使用して可能であれば一時ファイルを生成するためにこのドキュメントを実装し、それ以外の場合は書き込むランダムファイル名を生成しようとしています。その後、文書の内容がそのファイルに書き込まれ、ファイルを使用してファイルの内容がファイルからのように読み取られる標準入力にデータが提供されます<redir.clib/sh/tmpfile.cbash

おすすめ記事