回答:
これを行うと、読みやすくなります。
>&2 echo "error"
>&2
ファイル記述子#2をファイル記述子#1にコピーします。したがって、このリダイレクトが実行された後、両方のファイル記述子は同じファイルを参照します。1つのファイル記述子#2は元々参照されていました。詳細については、「Bash Hackers Illustrated Redirection Tutorial」を参照してください。
alias
シェルスクリプトでの使用については知りません。おそらく安全に使用できるでしょうerrcho(){ >&2 echo $@; }
errcho(){ >&2 echo $@|pr -To5;}
動作しません。:あなたのような最後のパイプの後にリダイレクトどこかに置く必要があるでしょうそのような何かをするにはerrcho(){ echo $@|>&2 pr -To5;}
あなたは関数を定義することができます:
echoerr() { echo "$@" 1>&2; }
echoerr hello world
これはスクリプトよりも高速で、依存関係はありません。
Camilo Martinのbash固有の提案は「ヒア文字列」を使用し、echoが通常飲み込む引数(-n)を含め、渡したものをすべて出力します。
echoerr() { cat <<< "$@" 1>&2; }
グレン・ジャックマンの解決策はまた、議論を飲み込む問題を回避します。
echoerr() { printf "%s\n" "$*" >&2; }
echoerr -ne xt
「-ne xt」は出力されません。printf
そのためのより良い使用。
echoerr() { cat <<< "$@" 1>&2; }
printf "%s\n" "$*" >&2
$IFS
空白で区切られたすべてが個別の引数として送信されます。これは、sでecho
それらを連結する手段の場合ですが、引用符を付けないこと0x20
の危険性は、入力する2文字少ないことの利便性をはるかに上回ります) 。
別のオプション
echo foo >>/dev/stderr
foo
-例えば-独自の標準エラー出力がリダイレクトされているfoo >foo.log 2>&1
-そして、echo foo >/dev/stderr
その前にすべての出力を壊します。 >>
代わりに使用してください:echo foo >>/dev/stderr
/dev/fd/2
ます。
/proc/self/fd/2
。以下の私の回答を参照してください:)
いいえ、それが標準的な方法です。エラーの原因にはなりません。
1>&2
ます。私たちは皆、これが起こらないことを望みますが、私たち全員がそれが起こる場所であったと確信しています。
( echo something 1>&2 ; something else ) > log
-> (echo something; cp some junk 1>&2 ; something else) > log
おっと。
メッセージをsyslogに記録してもかまわない場合、not_so_uglyの方法は次のとおりです。
logger -s $msg
-sオプションは、「メッセージを標準エラーおよびシステムログに出力する」という意味です。
これは単純なSTDERR関数で、パイプ入力をSTDERRにリダイレクトします。
#!/bin/bash
# *************************************************************
# This function redirect the pipe input to STDERR.
#
# @param stream
# @return string
#
function STDERR () {
cat - 1>&2
}
# remove the directory /bubu
if rm /bubu 2>/dev/null; then
echo "Bubu is gone."
else
echo "Has anyone seen Bubu?" | STDERR
fi
# run the bubu.sh and redirect you output
tux@earth:~$ ./bubu.sh >/tmp/bubu.log 2>/tmp/bubu.err
echo what | /dev/stderr
...
注:私は、誤解を招く/あいまいな「stderrに出力するエコー」質問ではなく、ポストに回答しています(OPによって既に回答されています)。
関数を使用して意図を示し、必要な実装を調達します。例えば
#!/bin/bash
[ -x error_handling ] && . error_handling
filename="foobar.txt"
config_error $filename "invalid value!"
output_xml_error "No such account"
debug_output "Skipping cache"
log_error "Timeout downloading archive"
notify_admin "Out of disk space!"
fatal "failed to open logger!"
そしてerror_handling
存在:
ADMIN_EMAIL=root@localhost
config_error() { filename="$1"; shift; echo "Config error in $filename: $*" 2>&1; }
output_xml_error() { echo "<error>$*</error>" 2>&1; }
debug_output() { [ "$DEBUG"=="1" ] && echo "DEBUG: $*"; }
log_error() { logger -s "$*"; }
fatal() { which logger >/dev/null && logger -s "FATAL: $*" || echo "FATAL: $*"; exit 100; }
notify_admin() { echo "$*" | mail -s "Error from script" "$ADMIN_EMAIL"; }
OPの懸念を処理する理由:
その他の理由:
私のおすすめ:
echo "my errz" >> /proc/self/fd/2
または
echo "my errz" >> /dev/stderr
echo "my errz" > /proc/self/fd/2
効果的に出力は以下となりますstderr
ので/proc/self
、現在のプロセスへのリンクです、そして/proc/self/fd
プロセス開かれたファイル記述子を保持し、その後、0
、1
、および2
のために立ってstdin
、stdout
そしてstderr
それぞれ。
/proc/self
リンクは、MacOSの上では動作しません、しかし、/proc/self/fd/*
Android上でTermuxで提供されていますが、ありません/dev/stderr
。BashスクリプトからOSを検出する方法は?使用するバリアントを決定することにより、スクリプトをよりポータブルにする必要がある場合に役立ちます。
/proc/self
私はもっと素直に固執ますのでリンクは、MacOSの上で作業をしない/dev/stderr
方法。また、他の回答/コメントに記載されているように>>
、追加に使用することをお勧めします。
/proc/self/fd/*
AndroidのTermuxで利用できますが、では利用できません/dev/stderr
。
cat
ここで言及されているものは使用しないでください。cat
はプログラム
でecho
ありprintf
、bash(シェル)ビルトインです。プログラムまたはその他のスクリプト(上記でも説明)を起動すると、すべてのコストを伴う新しいプロセスが作成されます。組み込み関数を使用すると、プロセス(-environment)を作成(実行)する必要がないため、関数の記述が非常に安価になります。
opnerは、「stderr に出力(パイプ)するための標準的なツールはありますか」と尋ねます。...パイプの再リダイレクトは、unix(Linux ...)やbash(sh)などのシステムでの基本的な概念であり、これらの概念に基づいています。
私&2>1
はこのような記法でリダイレクトすることはオープナーに同意します:現代のプログラマーにとってはあまり快適ではありませんが、それはバッシュです。Bashは巨大で堅牢なプログラムを作成するためのものではなく、管理者が少ないキー操作で作業できるようにするためのものです;-)
そして、少なくとも、行のどこにでもリダイレクトを配置できます。
$ echo This message >&2 goes to stderr
This message goes to stderr
cat
遅いのでcatを使用しないように誰かに指示することには違いがあります。猫が正しい選択である無数のユースケースがあるので、私はあなたの答えに反対する理由です。
echo
交換を求めた。cat
彼がを使用する場合でも、bashリダイレクトを使用する必要があります。とにかく。したがって、cat
ここで使用する意味はまったくありません。ちなみに私はcat
1日100回使用していますが、オープナーが要求したコンテキストではありません...
私が最近つまずいた別のオプションはこれです:
{
echo "First error line"
echo "Second error line"
echo "Third error line"
} >&2
これはBashビルトインのみを使用し、複数行のエラー出力をエラーが発生しにくくします(&>2
すべての行に追加することを覚えておく必要がないため)。
cat
か、他のユーティリティを助言するだけで、それは質問に対してトピック外です。
read
stderrに出力するシェル組み込みコマンドであり、リダイレクトトリックを実行せずにエコーのように使用できます。
read -t 0.1 -p "This will be sent to stderr"
これ-t 0.1
は、読み取りの主な機能を無効にするタイムアウトであり、stdinの1行を変数に格納します。
スクリプトを作成する
#!/bin/sh
echo $* 1>&2
それはあなたのツールになるでしょう。
または、スクリプトを個別のファイルに含めたくない場合は、関数を作成します。
Mac OS X:受け入れられた回答と他のいくつかの回答を試しましたが、すべてMacでSTDERRではなくSTDOUTと書きました。
Perlを使用して標準エラーに書き込む移植可能な方法を次に示します。
echo WARNING! | perl -ne 'print STDERR'