2017-10-25 10 views
4

私はしばらくの間bashでwarn関数を使用しています。bashのSTDERRにリダイレクトする3つの方法の違いは何ですか?

function warn { [ $# -gt 0 ] && printf '%s\n' "$*" >&2 ; } 

しかし、私は最近、次のいずれかの構造を使用する必要があると言われました。

function warn { [ $# -gt 0 ] && printf >&2 '%s\n' "$*" ; } 

または

function warn { [ $# -gt 0 ] && printf >&2 -- '%s\n' "$*" ; } 

私は--が(に渡されたパラメータは、ダッシュが含まれている場合、それはパラメータとして解析されない)を理解すると思います。

しかし、printfの直後か、最後にリダイレクトするのはどういう違いがありますか?

答えて

3

いずれの提案も必要ありません。あなたは$somestringはオプションと間違われる可能性(および他の理由のために推奨されません)

printf "$somestring" >&2 

のような何かをした場合の解決しようとする--問題があります。しかし、'%s\n'はそのような文字列ではありません。これは文字通りprintfの引数として渡されます。

移動する>&2は、コマンドの引数を特定する前にシェルが削除するため、何も実行しません。

私はあなたの関数への変更を提案するつもりだったならば、彼らはほぼ役に立たないfunctionキーワードを削除し、代わりにPOSIXスタイルの定義を使用する

  1. だろう。
  2. シェルが複数の引数を必要に応じて結合すると仮定するのではなく、警告メッセージで1つの引数を指定します。

warn() { [ $# -gt 0 ] && printf '%s\n' "$1" >&2 ; } 

warn "Do not do that" # not warn do not do that 
0

ここには違いはありません。リダイレクションは、bashによって解釈され消費される特別な構文であり、アプリケーションはコマンドラインでこれらのトークンを観察しません。コマンドの前にリダイレクトを付けることもできます(例:>&2 printf ...)。

関連する問題