web-dev-qa-db-ja.com

パイプと猫へのstdinリダイレクト

どして

echo "hello world" | cat

作業中

cat < echo "hello world"

ではない?私の(正しくない)直感は、パイプがstdoutcatstdinとしてリダイレクトすることです。

10

似ているが異なるものが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_およびredirectionpipelineHere Stringsを検索しますおよびプロセス置換
  • _man cat_使用するからといって...
13
Hastur

そのストリームはファイルから読み取ります。 >はファイルに出力され、<はファイルからです。デモンストレーション:

最初 echo "HELLO HELLO HELLO" > HELLO.txt その後 cat < HELLO.txt出力を取得します

 HELLO HELLO HELLO

出力はすでにあなたが望む場所に行くのでちょっとちょっと役に立たないが、同じHELLO.txtを使った別の例はcat < HELLO.txt >&1catの出力を明示的にSTDOUTに送信します。

さらに便利なのは、ファイル記述子2の出力(STDERR)が次のようなコマンドでリダイレクトされていることを見つけることがあります。

grep somepattern /path/to/a_bunch_of_files/* 2>&1 >> alloutput.txt

2>&1 streamは、エラーを標準出力に送ります。次に、すべての標準出力がalloutput.txtにストリーミングされます。これにより、エラー出力が標準出力のファイルに入れられます。

1
Bolwerk