シェル機能の名前は何ですか `>(tee copyError.txt>&2)`?


11

stdoutとstderrをログファイルに記録する必要がありますが、画面に表示されるのはエラーメッセージだけです。私はこれを行うことができます:

cp -rpv a/* b 1> copyLog.txt 2> >(tee copyError.txt >&2) 

ウェブのどこかで見つけました。

これがどう>(tee copyError.txt >&2)呼ばれるのか知りたいだけ?山かっこやかっこなどの文字は無視されるため、グーグルできません。


ファイルのリダイレクト(tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Kartik

@terdon OPは、StdOutとStdErrをファイルに記録したいが、画面にはStdErrも表示したいと述べていたと思います
Dmitry Avtonomov

回答:


11

からman bash

   Process Substitution
       Process substitution is supported  on  systems  that  support
       named  pipes  (FIFOs)  or  the  /dev/fd method of naming open
       files.  It takes the form of <(list) or >(list).  The process
       list  is  run with its input or output connected to a FIFO or
       some file in /dev/fd.  The name of this file is passed as  an
       argument  to  the current command as the result of the expan
       sion.  If the >(list) form is used, writing to the file  will
       provide  input  for  list.   If the <(list) form is used, the
       file passed as an argument should be read to obtain the  out
       put of list.

を押して/から検索文字列を入力すると、マンページを検索できます。これは、このような情報を見つけるための良い方法です。もちろん、検索するマンページを知っている必要があります:)

(ただし、検索時には特別な意味があるため、引用する必要があります。bashのマンページで関連するセクションを見つけるには、と入力し/>\(ます。


私は多くのbashを実行するので、bash> bashman.txtを実行して、読み取り専用にしました。これで、bashman.txtをテキストエディターの別のウィンドウに読み込み(読み取り専用)、エディターのすべての機能を使用して、検索、コピー、貼り付けを行うことができます。
Joe

8

>(tee copyError.txt >&2) 実際にはいくつかの異なる機能があります:

  • >(...)「プロセス置換」と呼ばれます。名前付きパイプファイルを作成し、/dev/fdそのファイルに書き込むと、括弧内にプロセスへの入力が提供されます。

  • >:一般に、これは「出力リダイレクト」と呼ばれ、標準出力(>または1>)または標準エラー(2>)をファイルまたはプロセスに送信できます。 >&2出力リダイレクトですが、この場合、出力はtee標準エラーに送信されます(つまり&2&1標準出力です)。

  • がなければ>、括弧(())はサブシェルを開始します。括弧内のコマンドを実行すると、それらのコマンドが実行されている間のみ存在する別のシェルが生成されます。サブシェルで変数を宣言すると、これがどのように機能するかを確認できます。

    $ foo='Tom';(foo='Dick'; echo "Sub: $foo"); echo "Orig: $foo"
    Sub: Dick
    Orig: Tom
    

    ご覧のとおり$foo、サブシェルで定義されたは、親シェルで定義されたものとは別のものです。


4
いいえ>(...)はリダイレクトではありません。>(...)ファイル名に展開されます。出力をそれにリダイレクトする場合は、リダイレクトが使用できない場合に必要ですが> >(...)>(...)より一般的に使用されます。OPのコマンドは従来のパイプで実現でき、そこでプロセスを置き換える必要はありません。
ステファンChazelas

@StephaneChazelasあなたが考えていた解決策を見るのは素晴らしいことでしょう
Dmitry Avtonomov '21 / 09/17

3
@chhh、cmd 2>&1 > output | tee err >&2
ステファンChazelas

@stephaneChazelas thx!
ドミトリーAvtonomov 2013

この回答の前半は間違っているか、少なくとも誤解を招く可能性があります。それは事実だ>出力リダイレクトを表すことができ、それは()サブシェルを表すことができますが、>(...)実際にはで構成されていない単一の一体機能です>()
ruakh 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.