私は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.c
lib/sh/tmpfile.c
bash