cat> file << "END"はどのように機能しますか?

cat> file <<
$ cat > file << "END"
> asdf
> qwerty
> END
$ cat file
asdf
qwerty
$

上記のトリックがどのように機能するのかわかりません。

cat > fileこれは、その出力がcatリダイレクトされて書き込まれるという意味であることをある程度理解できますfile

この部分は<< "END"どのように機能しますか?私は、少なくともこれは、文字列が次のようENDに処理されるべきであることを意味すると仮定catします。したがって、file最後に3文字の行のみを含める必要があるとしますEND。これは、「コンソールから入力を受け入れ、catユーザーが入力するまで区切り文字として処理する必要がある文字列にリダイレクトする」ことを意味する方法はわかりません。

ベストアンサー1

あなたの質問は「どのように」ではないようです。ここのドキュメントスクリプトファイルで使用方法が正しく説明されているので動作します。インタラクティブな使用を理解していないようです。以下はあなたのために問題を解決する(非常に簡単な)集中コースです。

すべてのUnixプロセスと同様に、シェルにはデータを読み書きできる入力および出力ストリームがあります。これには少なくとも1つの入力ストリーム(およびstdin)と2つの出力ストリーム(およびstdoutstderrがありますが、読み取りおよび書き込み(主にファイルからの読み取りまたは書き込み)に必要なだけ入力ストリームを開いて閉じることができます。プロセスがストリームを処理する方法は、プロセスによって異なります。たとえば、引数なしで呼び出された場合にcatコピーします。シェルは通常、入力ストリームを実行するコマンドとして解釈します(そして、いくつかの構文に従って、そのコマンドの入力ストリームと出力ストリームを設定します)。stdinstdout

入力データはどこから来ますか?これは、それを転送する他のプロセスから来ることも、ファイルから読み取ることも、ユーザー(シェル)が直接入力することもできますstdin。この場合、ユーザー入力を受け取り、ロードする別のプログラムが必要です。ストリームとして。このようなプログラムを a といいtty、この場合ストリームは次のようになります。に添付tty(これはttyウィンドウが提供される端末エミュレータと同じではありませんが、広くはストリームが次のようになると言うこともできます。端末に接続してください。)

シェルは、入力を待っている間にプロンプ​​トを印刷するなど、stdinaに接続して動作が異なる時期を知っていますが、実際には大きな違いはありません。ttyプロンプトは通常次のとおりですuser@host:current_path$。変数を変更して正確な内容を定義できますPS1。一般的な慣例は、$一般ユーザーの場合は終了し、一般#ユーザーの場合は終了しますroot

スクリプトを実行すると、シェルはスクリプトを含むファイルに入力ストリームを追加し、ここからコマンドを読み込みます。いずれかのコマンドに以下が含まれている場合ここのドキュメントつまり、のような<<END意味は次のとおりです。これから、このターミネータだけを含む行まで、ストリームデータをコマンドとして解釈するのをやめてstdin実行したいコマンド(catあなたの場合)に渡すと、少しの損傷が発生する可能性があります。今はそれが私たちを悩ませていません。これはおそらく他の観点から見てもすでに知っているものです。

入力がaに追加されると、ttyここにある文書の意味は同じです。つまり、ストリームデータをコマンドとして解釈するのを停止し、stdin終了者まで実行したいコマンドに渡します。唯一の違いは、入力を待っている間にプロンプ​​トが印刷されることです。このプロンプトは、シェルが入力データをコマンドとして解釈したときに印刷されるプロンプトと同じではなく、渡されることを示しています。これはPS2デフォルト値に設定された変数として定義されます>。入力すると、ターミネータが読み取られるまで各行の先頭に表示されます。cat file > file << "END"この時点で、シェルは通常の動作を再開し、PS1-promptを印刷し、入力がコマンドとして解釈されるのを待ちます。

おすすめ記事