$ 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つの出力ストリーム(およびstdout
)stderr
がありますが、読み取りおよび書き込み(主にファイルからの読み取りまたは書き込み)に必要なだけ入力ストリームを開いて閉じることができます。プロセスがストリームを処理する方法は、プロセスによって異なります。たとえば、引数なしで呼び出された場合にcat
コピーします。シェルは通常、入力ストリームを実行するコマンドとして解釈します(そして、いくつかの構文に従って、そのコマンドの入力ストリームと出力ストリームを設定します)。stdin
stdout
入力データはどこから来ますか?これは、それを転送する他のプロセスから来ることも、ファイルから読み取ることも、ユーザー(シェル)が直接入力することもできますstdin
。この場合、ユーザー入力を受け取り、ロードする別のプログラムが必要です。ストリームとして。このようなプログラムを a といいtty
、この場合ストリームは次のようになります。に添付tty
(これはtty
ウィンドウが提供される端末エミュレータと同じではありませんが、広くはストリームが次のようになると言うこともできます。端末に接続してください。)
シェルは、入力を待っている間にプロンプトを印刷するなど、stdin
aに接続して動作が異なる時期を知っていますが、実際には大きな違いはありません。tty
プロンプトは通常次のとおりですuser@host:current_path$
。変数を変更して正確な内容を定義できますPS1
。一般的な慣例は、$
一般ユーザーの場合は終了し、一般#
ユーザーの場合は終了しますroot
。
スクリプトを実行すると、シェルはスクリプトを含むファイルに入力ストリームを追加し、ここからコマンドを読み込みます。いずれかのコマンドに以下が含まれている場合ここのドキュメントつまり、のような<<END
意味は次のとおりです。これから、このターミネータだけを含む行まで、ストリームデータをコマンドとして解釈するのをやめてstdin
実行したいコマンド(cat
あなたの場合)に渡すと、少しの損傷が発生する可能性があります。今はそれが私たちを悩ませていません。これはおそらく他の観点から見てもすでに知っているものです。
入力がaに追加されると、tty
ここにある文書の意味は同じです。つまり、ストリームデータをコマンドとして解釈するのを停止し、stdin
終了者まで実行したいコマンドに渡します。唯一の違いは、入力を待っている間にプロンプトが印刷されることです。このプロンプトは、シェルが入力データをコマンドとして解釈したときに印刷されるプロンプトと同じではなく、渡されることを示しています。これはPS2
デフォルト値に設定された変数として定義されます>
。入力すると、ターミネータが読み取られるまで各行の先頭に表示されます。cat file > file << "END"
この時点で、シェルは通常の動作を再開し、PS1
-promptを印刷し、入力がコマンドとして解釈されるのを待ちます。