プロローグ
2022年末、人類はWSLのファイルシステムを消し飛ばした*1のであった。かけがえのないシェルの履歴*2の思い出と共に。
シェルの履歴が全部消えると、補完に頼って入力しているコマンドが急に打てなくなって、不便になる。2023年はこういった悲しみを減らしていきたい。
ということで、表題の取り組みをやっていくことにした。
バックアップするスクリプトを書く
以下のようなスクリプトを ~/local/bin/backup-zsh-history
など適当なパスに置いた。5秒おきに ~/.zsh_history
ファイルをDropboxにコピーするスクリプトになっている。-u
オプションを付けることで、~/.zsh_history
が更新されていなかったらコピーしないようにしている。
#!/bin/sh set -eu if [ "$BACKUP_DEST_PATH" = "" ]; then echo 'BACKUP_DEST_PATH not set' > /dev/stderr exit 1 fi while sleep 5; do cp -u /home/utgwkk/.zsh_history $BACKUP_DEST_PATH done
systemd unit fileを書く
スクリプトを手軽にdaemonizeできたらなんでもいい。最近のWSLではsystemdが使えるので、unit fileを書いて適当なところに設置したらよい。user unitは使えない*3ようなので、最速で動くことを重視して /etc/systemd/system
ディレクトリ以下に置いた。
[Unit] Description=Backup zsh_history [Service] Environment=BACKUP_DEST_PATH=/mnt/c/Users/utgwkk/Dropbox/zsh_history/kaede ExecStart=/home/utgwkk/local/bin/backup-zsh-history [Install] WantedBy=default.target
あとはこのunitを動かせば完成する。
エピローグ
2023年はこのようにしてシェルの履歴をDropboxにバックアップすることにした。これでまたWSLのファイルシステムを吹き飛ばしてもDropboxから復元できるはず。WSLでsystemdが (おおむね) 動くようになったのを知れたのもよかったと思う。systemd user unitが動くようになったらまた教えてください。
(2023/1/4 17:23 追記)
シェルの履歴をDropboxにバックアップする取り組み - 私が歌川ですb.hatena.ne.jp事故で空っぽのファイルになったときに困りそうだけど file history あるからいいみたいな理論なのかな
2023/01/04 17:15
だいたいそういう理論です。コピー元のファイルサイズが明らかに小さかったらcpしない、みたいなことができるとより安全になりそうだけど、うまくできるかどうか。
(2023/1/4 17:25 追記)
ある程度の期間ごとにコピー先のファイルを分けることもできそう、しかしDropbox上のファイルが増殖しまくるのでは?
おまけ: WSLでsystemdを有効にしたらWindowsのexeファイルがexec format errorで実行できなくなる
WSLでsystemdを有効にしたら、見出しのような現象が発生した。WSL上ではWindowsの実行ファイルも実行できるはずだが、以下のようにexec format errorが出て実行できなくなる。
% /mnt/c/win32yank/win32yank.exe -o zsh: exec format error: /mnt/c/win32yank/win32yank.exe
WSLのリポジトリのissueでworkaroundが紹介されているので、これに倣えばよい。
つまり、以下のような内容のファイルを /usr/lib/binfmt.d/WSLInterop.conf
というパスに保存して sudo systemctl restart systemd-binfmt
コマンドを実行したら直る。
:WSLInterop:M::MZ::/init:PF