私が歌川です

@utgwkk が書いている

シェルの履歴をDropboxにバックアップする取り組み

プロローグ

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にバックアップする取り組み - 私が歌川です

事故で空っぽのファイルになったときに困りそうだけど file history あるからいいみたいな理論なのかな

2023/01/04 17:15
b.hatena.ne.jp

だいたいそういう理論です。コピー元のファイルサイズが明らかに小さかったら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が紹介されているので、これに倣えばよい。

github.com

つまり、以下のような内容のファイルを /usr/lib/binfmt.d/WSLInterop.conf というパスに保存して sudo systemctl restart systemd-binfmt コマンドを実行したら直る。

:WSLInterop:M::MZ::/init:PF

*1:dpkgの依存が解決できなくなったので破壊した

*2:.zsh_history

*3:systemctl --user コマンドがFailed to connect to bus: No such file or directoryというエラーを返す。あまり深追いしていない