実験的に実行しようとしましたが、set -o noclobber
エラーecho foo > /dev/null
は表示されませんでした。
bash-3.2$ set -o noclobber
bash-3.2$ echo "foo" > /dev/null
bash-3.2$ echo "bar" > /dev/null
bash-3.2$ echo "baz" > /dev/null
ただし、以前に作成したファイルに対して同じ操作を試みると、予想されるエラーが表示されます。
bash-3.2$ touch bar.txt
bash-3.2$ echo "bar" > bar.txt
bash: bar.txt: cannot overwrite existing file
noclobber
このファイルは/dev/null
他のファイルとは異なる方法で処理されていますか?
注:理解してください。なぜ(つまり、性格と目的のために/dev/null
)これを行うことはできますが、それに関する文書はありません。ここ。私はこれが文書化されていない機能だと思います。または(おそらく)文書を見逃した可能性があります。
答え1
3.6.2 出力リダイレクト説明する:
リダイレクト演算子が ""で、組み込みオプションが
>
有効になっていると、単語拡張のために名前が生成されたファイルが存在し、通常のファイルの場合、リダイレクトは失敗します。noclobber
set
しかし、/dev/null
家族と一緒にはいけません。定期的な文書。 「文字特殊ファイル」です。
$ [ -c /dev/null ] ; echo $?
0
$ [ -f /dev/null ] ; echo $?
1
FIFOパイプなどの他の非伝統的なファイルにも同様に適用されます。
$ mkfifo foo; set -o noclobber
$ echo > .bashrc
bash: .bashrc: cannot overwrite existing file
$ cat foo & echo a > foo
[1] 18857
a
(おそらくソケット、ブロックデバイスなど)