パイプと変数の割り当ての違いは何ですか?
私はあなたを知っていますヌルバイトは使用できません。。またどんな例がありますか?
以下のパイプラインはどうですかyes | cat
?y
出力を割り当てるとき
test=`yes`
何も出力しません。実行中にcat
データが転送される前にコマンド全体が実行されますか?
答え1
test=`yes`
出力全体を読み込み、yes
それを変数に割り当てようとしていますtest
。
の出力はyes
無限なので、この割り当ては無限ループを呼び出します。
その後、タスクpipe
などのオペレーティングシステムメカニズムを使用します|
。
test=`yes`
少し
yes | thisShell.slurpInputAndSaveToVariable test
cat
入力全体を吸収する試みは行われないため、ストリーミングプロデューサ(この場合は無制限)と消費者のペアで同時に実行できますyes
。cat
答え2
管路
yes
終了するまで文字列(デフォルトは「y」)を繰り返し出力するコマンドです。バラよりman yes
cat
STDINから受け取ったすべての項目または引数としてリストされているすべてのファイルの接続をSTDOUTに出力するコマンド。バラよりman cat
Pipe(|
)は、前のコマンドのSTDOUTを次のコマンドのSTDINにリダイレクトします。
したがって、配管はcat
CPUサイクルの無駄です。
変数の割り当て
変数の割り当てにより、文字列をメモリに一時的に保存できます。
例:
$ 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は問題ありません。