10

この質問ではgrep、使用法のテキストがstderrに出力されるため、を使用します。

$ grep
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

プロセス置換を使用すると、stdoutを簡単にキャプチャできます。

$ read b < <(echo hello world)

ただし、stderrはプロセス置換をすり抜けて、コンソールに出力します。

$ read b < <(grep)
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

プロセス置換を使用してstderrをキャプチャしたいと思います。私は今これを使用しています:

$ grep 2> log.txt

$ read b < log.txt

しかし、私は一時ファイルを避けたいと思っています。

4

3 に答える 3

13

コマンドの stderr を stdout にリダイレクトします。

$ read "b" < <(grep 2>&1)
$ echo "$b"
Usage: grep [OPTION]... PATTERN [FILE]...

コマンドの出力をBashの変数に保存する従来の方法は、次を使用すること$()です:

$ b=$(grep 2>&1)
$ echo "$b"
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.
于 2013-03-13T17:45:59.753 に答える
1

サブシェル全体のより一般的な解決策は、exec標準エラーをリダイレクトするために使用することです。

OPの例が単一のコマンドに基づいているのではなくgrep、サブシェルに一連のコマンドがある場合は、サブシェル全体の標準エラーを次のようにリダイレクトできます。

b=$(cat <(
    exec 2>&1
    echo "standard output"
    echo "standard error" 1>&2
   ))    

echo $b

これは、標準出力と標準エラーの出力を変数に入れます$b:

standard output standard error

echoステートメントは、標準出力と標準エラーのそれぞれに何かを出力するための単なる例です。

于 2014-10-17T10:23:56.467 に答える