'>&2' を変数に格納する方法

'>&2' を変数に格納する方法

同様の質問ですが、回答はありません:変数に保存されたコマンドを実行するにはどうすればよいですか?

bash スクリプトで次の操作を実行するにはどうすればよいですか?

error=">&2"
echo 'something went wrong' $error

の代わりに

echo 'something went wrong' >&2

なぜでしょうか?
のようにタイプミスすると>2&、正常に動作しますが、 というファイルにエラー メッセージが書き込まれるためです2

答え1

コメントで言われているように、実際にはそうではありません。

まあ、 でそれを行うこともできますevalが、すべてを引用符/エスケープすると問題が発生しますそれ以外そのコマンドラインで。

ただし、関数を使用して実行できる操作がいくつかあります。リダイレクト下で特定の単純なコマンドを実行したり、stderr にメッセージを書き込んだりすることができます。

#!/bin/bash
tostderr() {
        "$@" >&2
}

warn() {
        local IFS=" "
        printf "%s\n" "$*" >&2
}

tostderr printf "warning: %s\n" "something happened"

warn another thing to warn about

強調する単純最初のコマンドはそうではなくeval、コマンド内にシェル構文を含めることはできません。たとえば、tostderr foo | bar出力がfoo(パイプを通過して stderr に)リダイレクトされるため、tostderr (foo | bar)機能しません。


zsh を使用していて、本当に必要な場合は、グローバル エイリアスを使用してリダイレクトを追加できます (ただし、これは難読化されたコーディングに近いと考える人もいるかもしれません)。

#/usr/bin/zsh

alias -g TOSTDERR='>&2'
echo something bad happened TOSTDERR

関連情報