これはなに?
ファイルの中身をコピーしようと思って pbcopy
コマンドを使ったら、ファイルの中身を全て削除してしまったので、自戒の記事。
復元方法ではなく、再発防止策について書いていく。
ちなみに、事前にバックアップをとっていれば復元可能なケースもあるようですが、そんなものは用意していなかったので、復元方法はなさそう。
もしあるのならば知りたい。。。
環境
- macOS Monterey: v12.5.1
- zsh
やらかした内容
hoge.txt
の内容をコピペしたい。
# まずはファイルの中身を確認する
$ cat hoge.txt
hoge
fuga
piyo
# 中身ヨシ👉
# `pbcopy` コマンドで中身コピー実行!
$ pbcopy > hoge.txt
# コマンド打ったらなかなか終わらないし、対話モードっぽいのに入ったからコマンド間違えたかな?
# とりあえず `⌃ C` で一回実行止めればヨシ👉(よくない)
^C
$
# リダイレクト `>` の向き先が逆だった……
# コマンド再実行!
$ pbcopy < hoge.txt
途中でコマンド間違えたけど、再実行したし ⌘ + v
でペーストしてみるか!
……できない。
ファイルの中身も入っていたはずなのになぜ??
一応もう一回ファイルの中身確認しとくか……
$ cat hoge.txt
何も表示されない。
オワリ。
何が起こったか
まず、本来の「 hoge.txt
の中身をクリップボードに書き込む」という目的を達成するのに適切なコマンドは下記だった。
$ pbcopy < hoge.txt
しかし、1回目コマンドでは上記とリダイレクト >
の向き先が真逆だったため、
「無」を hoge.txt
ファイルの中身に上書きされてしまったらしい。(※)
結果として、1回目コマンド実行した時点で hoge.txt
の中身は全て吹っ飛んで空のファイルが出来上がり、
2回目に正しいコマンド実行しても空の内容がクリップボードにコピーされてしまった次第。
※補足
pbcopy > hoge.txt
の正確な動作がどのようなものか、までは調べきれてない。
クリップボードの中身がファイルに書き込まれるのかなと思ったけど、そんなことはなかった。
再発防止策
というわけで、ここから本題。
そもそも今回のやらかし原因は、shellやリダイレクト >
の知識不足というのもあるが、今後も誤操作する可能性は十分にある事象。
ということで、shell利用時に想定外にファイルの中身を上書きしてしまう危険性を排除するための対策を施す。
具体的には .zshrc
に以下を追記。
set -o noclobber
参考記事は下記。
対策できたか試してみる。
.zshrc
の内容を反映するために、ターミナル再起動もしくは source .zshrc
を実行済みの状態。
# `hoge.txt` の中身を確認する
$ cat hoge.txt
hoge
fuga
piyo
# 間違えたコマンドを実行してみる
$ pbcopy > hoge.txt
zsh: file exists: hoge.txt
# `hoge.txt` の中身を確認する
$ cat hoge.txt
hoge
fuga
piyo
しっかり上書きが防止されている。
めでたしめでたし。(※)
※ちなみに、実際に吹っ飛ばした時に操作していたのはtxtファイルではなく、秘密鍵でした。
何もめでたくない。
オワリ。