パイプと変数の割り当て

パイプと変数の割り当て

パイプと変数の割り当ての違いは何ですか?

私はあなたを知っていますヌルバイトは使用できません。。またどんな例がありますか?

以下のパイプラインはどうですかyes | caty出力を割り当てるとき

test=`yes`

何も出力しません。実行中にcatデータが転送される前にコマンド全体が実行されますか?

答え1

test=`yes` 

出力全体を読み込み、yesそれを変数に割り当てようとしていますtest

の出力はyes無限なので、この割り当ては無限ループを呼び出します。

その後、タスクpipeなどのオペレーティングシステムメカニズムを使用します|

test=`yes`

少し

yes | thisShell.slurpInputAndSaveToVariable test

cat入力全体を吸収する試みは行われないため、ストリーミングプロデューサ(この場合は無制限)と消費者のペアで同時に実行できますyescat

答え2

管路

yes終了するまで文字列(デフォルトは「y」)を繰り返し出力するコマンドです。バラよりman yes

catSTDINから受け取ったすべての項目または引数としてリストされているすべてのファイルの接続をSTDOUTに出力するコマンド。バラよりman cat

Pipe(|)は、前のコマンドのSTDOUTを次のコマンドのSTDINにリダイレクトします。

したがって、配管はcatCPUサイクルの無駄です。

変数の割り当て

変数の割り当てにより、文字列をメモリに一時的に保存できます。

例:

$ test="this is a string!"
$ echo $test
this is a string!

コマンドの結果を変数に保存するには、サブシェルを使用する必要があります。

例:

$ echo "file contents :)" > test.file
$ test="$(cat test.file)"
$ echo $test
file contents :)

引用する

Bashの詳細な使い方については、以下を参照してください。https://www.gnu.org/software/bash/manual/bash.html

答え3

パイプはその名前が意味するものを正確に実行します。つまり、あるパイプメンバーから次のパイプメンバーにデータをストリーミングする方法を提供します。サイズに制限なくストリームを処理できます。無限ストリームを処理することが意味のある状況には、これまでに見た内容の進捗状況や統計情報を印刷する場合、およびユーザーがいつでもパイプを終了できる状況が含まれます。

一方、シェル代替構成(バックティックまたは $())は、埋め込みステートメントが終了するまで完了しません。例の文はyes終了しないため、どちらも終了しません$(yes)

私はこれがパイプとは非常に異なる割り当て方法であると言いたいと思います。実際、変数に無限の長さの値を割り当てることはできませんが、パイプ1は問題ありません。

関連情報