web-dev-qa-db-ja.com

バッシュ: "> |"とは行う?

私はこれが書き留められたのを見たところです。

$ some-command >| /tmp/output.txt

垂直パイプは、1つのコマンドの出力を別のコマンドに「パイプ」する標準のリダイレクトで使用されます。>|は、このシナリオでは>と同じであるため、実際にはまったく役に立ちませんか?

152
jwbensley

それは役に立たないわけではありません-それはプレーンな>リダイレクト演算子の特殊な形式です(そして、おそらく混乱を招くかもしれませんが、パイプとは関係ありません)。 bashおよび他のほとんどの最新のシェルには、オプションnoclobberがあります。これにより、リダイレクトが既存のファイルを上書きまたは破壊するのを防ぎます。たとえば、noclobberがtrueで、ファイル/tmp/output.txtがすでに存在する場合、これは失敗するはずです。

$ some-command > /tmp/output.txt

ただし、noclobberの設定を>|リダイレクト演算子で明示的に上書きできます。noclobberが設定されていてもリダイレクトは機能します。

現在の環境でnoclobberset -oで設定されているかどうかを確認できます。

歴史的なメモとして、「noclobber」オプションとそのバイパス機能はどちらもcsh(70年代後半)に由来しています。 kshはそれをコピーしましたが(80年代前半)、>|ではなく>!を使用しました。 POSIXはksh構文を指定しました(bashを含むすべてのPOSIXシェル、一部のシステムでshとして使用される新しいash派生物はそれをサポートしています)。 Zshは両方の構文をサポートしています。 Bourne Shellバリアントには追加されていないと思いますが、私は間違っているかもしれません。

229
D_Bye