`>> / dev / stderr`(空白あり)と`>&2`の違いは何ですか?


11

バッシュで。

何を使うべきか判断するのが難しいのですが?

私のすべてのスクリプトは「>> / dev / stderr」を使用します

bashのプロンプトで、私がしようとした場合:
echo test >>/dev/stderr作品
echo test >> /dev/stderr作品が
echo test >/dev/stderr作品
echo test > /dev/stderr作品

echo test >>&2失敗!
echo test >> &2失敗!
echo test >&2作品は
echo test > &2失敗します!

すべてのスクリプトをに変更してもかまいません>&2

また、ssh(後su SomeUser)に大きな影響を与えるようで、>>/dev/stderrまったく機能せず(権限が拒否されます)、機能するだけ>&2です。


あなたはsshエラーの例を示すことができますか?再現できません。
ジェフシャラー

@JeffSchaller正解です。su問題が発生してからのみです。質問を更新しました
Aquarius Power

@AquariusPower、...ちなみに、その不一致を説明するには:でsu -c 'some command'、そのコマンドはでは/bin/shなくによって実行されるbashため、bash固有の動作(/dev/stderr使用できない場合のリダイレクト目的のシミュレーションなど)が存在することは保証されません。
Charles Duffy

回答:


22

>& nファイル記述子直接複製するためのシェル構文です。ファイル記述子2はstderrです。それがその方法です。stderrだけでなく、他のファイル記述子も複製できます。ファイル記述子の複製は(stderrがファイルであっても)切り捨てられる>&ことはなく、1つのトークンであるため、ここでは追加モードを使用できません。そのため、その中にスペースを入れることはできませんが、>& 2機能します。

>> name は、許可されている別の構文です。 nameはファイル名です(トークンはです>>)。この場合、ファイル名を使用しています/dev/stderr。これは、OS固有の処理(Linuxではへのシンボリックリンク/proc/self/fd/2)によっても標準エラーを意味します。追加モードと切り捨てモードは、stderrがターミナルである場合、切り捨てることができないため、同じことを実行します。あなたの標準的なエラーがファイルである場合は、しかし、それがされます切り捨てられます。

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

エラーが発生した場合 /dev/stderrover sshで、サーバー管理者がセキュリティ対策を適用しているため、シンボリックリンクが機能しない可能性があります。(例:/procまたはにアクセスできません/dev)。私はいずれかの種類の奇妙な破損を引き起こすと思いますが、重複したファイル記述子構文を使用することは完全に合理的な(そしておそらく少し効率的な)アプローチです。個人的には好きです。


私が以前に持っていた切り捨てられた問題を再現するのに大きな問題がありました(さもなければ、それを質問に追加したでしょう)使用するためにすべてを変更した理由>>、それを指摘するためのthx!また、su SomeUsersshを介して接続した後、ステップを逃しました。
Aquarius Power

これはbash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/fooあなたを切り捨てることはありません!(でも2>&1 |tee /tmp/foo)ロギングに最適なもので、すべてをに変更すると完全に機能し>&2ます。だから私は直接ファイルの使用だけ/dev/stderrが切り捨てを許可し、重複した記述子は許可しないと思います!
Aquarius Power

@AquariusPower正しい、重複したファイル記述子が切り捨てられることはありません。それは最初のパラグラフにあります、多分私はそれをどうにか強調する必要がありますか?
derobert 2016

必要ない、私はときどき遅いです
Aquarius Power

3
この答えは改善することができます。>&は2つのトークンではなく1つのトークンであり、そこにはOPの混乱があります。
Joshua

8

失敗のケースが発生するのは、リダイレクトで使用するbash構文&単一のを指定>し、&記号に直接隣接して存在する必要があるためです。

[n]>&word


2

使用する '>'リダイレクト(存在する場合は切り捨て)または'>>'(存在する場合は追加)にします。

'>&'ストリームを複製するために使用します。たとえば、同じファイルに標準出力と標準エラーが必要な場合は、ファイルにリダイレクトし'> output.log''2>&'

myjob.sh > output.log 2>&
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.