どして
echo "hello world" | cat
作業中
cat < echo "hello world"
ではない?私の(正しくない)直感は、パイプがstdout
をcat
にstdin
としてリダイレクトすることです。
似ているが異なるものが2つあります
A pipeline
_echo "hello world" | cat # This is a pipeline
_
パイプ制御演算子(_|
_および_|&
_)は、コマンドの出力をパイプライン内の次のコマンドの入力に接続します。 最初の例が機能する、echo
コマンドの出力 "Hello Word"は、次のcat
コマンドの入力と接続され、標準特に指定がない場合は、入力ファイルとして入力します。実際、_man cat
_から読み取ることができます。
cat-ファイルを連結して標準出力に出力する
cat
を呼び出すだけの例の下に
_
cat Copy standard input to standard output
_
リダイレクト、またはより良い入力リダイレクトの試み_<
_
_cat < echo "hello world" # This is an attempt of redirection
_
この場合、cat
コマンドは、_<
_の右側のファイルから演算子_<
_を使用して、標準入力から入力を取得していますredirect。 ..それはファイルではありません。これは機能しないためです。
_man bash
_のリダイレクトセクションから
入力のリダイレクト
入力のリダイレクトにより、Wordの展開から名前が付けられたファイルが開かれ、ファイル記述子n、またはnが指定されていない場合は標準入力(ファイル記述子0)が読み取られます。
Bashでは、さまざまな理由で機能します
cat <(echo "hello world")
プロセス置換
プロセス置換は、名前付きパイプ(FIFO)または/ dev/fdメソッドでオープンファイルに名前を付けることをサポートするシステムでサポートされています。
<(list)
または>(list)
の形式を取ります。プロセスリストは、入力または出力がFIFOまたは_/dev/fd
_のファイルに接続されている状態で実行されます。このファイルの名前は、結果として現在のコマンドに引数として渡されます。>(list)
フォームが使用されている場合、ファイルへの書き込みはリストの入力を提供します。<(list)
フォームが使用されている場合、引数として渡されたファイルはリストの出力を取得します。
cat <<< $(echo "hello world")
こちらの文字列
Wordは、中括弧の展開、チルダの展開、パラメータと変数の展開、コマンドの置換、算術展開、および引用の削除を行います。パス名の展開とワード分割は行われません。結果は、標準入力でコマンドに単一の文字列として提供されます。
参考資料
man bash
_およびredirection、pipeline、Here Stringsを検索しますおよびプロセス置換man cat
_使用するからといって...そのストリームはファイルから読み取ります。 >
はファイルに出力され、<
はファイルからです。デモンストレーション:
最初 echo "HELLO HELLO HELLO" > HELLO.txt
その後 cat < HELLO.txt
出力を取得します
HELLO HELLO HELLO
出力はすでにあなたが望む場所に行くのでちょっとちょっと役に立たないが、同じHELLO.txtを使った別の例はcat < HELLO.txt >&1
cat
の出力を明示的にSTDOUTに送信します。
さらに便利なのは、ファイル記述子2の出力(STDERR)が次のようなコマンドでリダイレクトされていることを見つけることがあります。
grep somepattern /path/to/a_bunch_of_files/* 2>&1 >> alloutput.txt
2>&1
streamは、エラーを標準出力に送ります。次に、すべての標準出力がalloutput.txtにストリーミングされます。これにより、エラー出力が標準出力のファイルに入れられます。