読者です 読者をやめる 読者になる 読者になる

ゲンゾウ用ポストイット

Java、Groovy、Linux関連の備忘録

Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする

Bash

背景

bashクックブック を読み進めています。

標準で ON にしておくと良さそうな設定がありました。 Bashでリダイレクトにより誤って既存ファイルを上書きしてしまわないようにする設定です。

環境

$ uname -a
Darwin genzouw-MacBook-Pro.local 15.2.0 Darwin Kernel Version 15.2.0: Fri Nov 13 19:56:56 PST 2015; root:xnu-3248.20.55~2/RELEASE_X86_64 x86_64 i386 MacBookPro10,1 Darwin


$ bash -version
GNU bash, バージョン 4.3.42(1)-release (x86_64-apple-darwin14.5.0)
    Copyright (C) 2013 Free Software Foundation, Inc.
    ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

    This is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

"set -o noclobber"

"set -o noclobber" を実行すると、すでに存在しているファイルをリダイレクトにより上書きできなくなります。 ファイルが存在しない場合は問題なく新規作成されます。 追記も問題なくできます。

$ set -o noclobber

# 新規はできる
$ echo 123 > x.txt

$ ls
x.txt

# 上書きはできない
$ echo 456 > x.txt
bash: x.txt: 存在するファイルを上書きできません

# 追記はできる
$ echo 456 >> x.txt

# >| を使えば上書き可能
$ echo abc >| x.txt

# -o ではなく +o で設定をOFFにできる
$ set +o noclobber

# OFFにしていれば、上書き可能
$ echo 789 > x.txt

ひとこと

明示的な上書きは >| を使うという書き方でルール化するのは有りだなと思いました。