Atuin (Magical Shell History) を導入して複数シェル環境の履歴を同期できるようにした

Atuin (Magical Shell History) を導入して複数シェル環境の履歴を同期できるようにした
Page content

Atuin: Magical shell history

シェル環境での履歴管理を “magical” にしてくれるというツール「Atuin」を見つけたので、試してみました。

Atuinは、ターミナル画面からCtrl+Rで呼び出して使うシェル履歴管理ツールです (Ctrl+Rはシェル標準と同じキー)。履歴をEnd-to-Endで暗号化した上でクラウド同期する機能があり、複数のシェル環境をまたいで自身の履歴の使い回しができそう……というところに惹かれました。公式サイトは下記の通り。

1台目での導入手順

今回、Atuinを導入する1台目の環境は次の通り。

項目内容
OSmacOS Monterey 12.6.3
シェルbash 5.2.15
ターミナルソフトiTerm2

私が激しくハマった2つの落とし穴と事前回避策を、最初に Step-0 として記述します。

Step-0-1. bashの場合: 最新バージョンのbashへ切り替えよう

たとえばmacOS標準のbashは3系で、3系だとAtuinのキー操作が意図通りに行えないように思われます (落とし穴その1……orz)。3系を使っていた場合にはHomebrewなどで最新のbash 5系をインストールしておきます。

macOS環境でのbashのバージョンを確認してみると3系でした。

$ which bash
/bin/bash
$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin21)
Copyright (C) 2007 Free Software Foundation, Inc.

そこで、Homebrewで最新のbashをインストールします。

$ brew install bash

$ which bash
/opt/homebrew/bin/bash
$ /opt/homebrew/bin/bash --version
GNU bash, バージョン 5.2.15(1)-release (aarch64-apple-darwin21.6.0)
Copyright (C) 2022 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.

次に、ログインシェルをHomebrewでインストールしたbashへ変更します。たとえばターミナルソフトiTerm2の場合は、Preferences > Profiles > General > Command にて Command: /opt/homebrew/bin/bash を選択&入力します。

Step-0-2. iTerm2の場合: Option Keyの設定を「Esc+」へ変更しておこう

今回の環境に固有の問題なのかもしれませんが、iTerm2の初期設定状態ではAtuinでのAltキーがうまく働きませんでした (落とし穴その2……orz)。そこで事前にiTerm2の設定の Preferences > Profiles > Keys を次のように変更しておきます。(参考: Alt-N jump back doesn’t work on MacOS · Issue #417 · ellie/atuin)

設定項目変更前変更後
Left Option KeyNormalEsc+
Right Option KeyNormaiEsc+

Step-1. Atuinのインストール

公式サイトの Getting Started | Atuin に沿って、Atuin (v14.0.1) の導入を進めます。ここではQuickstartの With the default sync server の手順を実行します。すると、macOS環境では次のようにbrew経由でAtuinがインストールされました。

## 事前に内容確認
$ curl https://raw.githubusercontent.com/ellie/atuin/main/install.sh | less

## インストール実行
$ bash <(curl https://raw.githubusercontent.com/ellie/atuin/main/install.sh)
(snip)
Detected Mac!
Installing with brew
(snip)
Thanks for installing Atuin! I really hope you like it.

If you have any issues, please open an issue on GitHub or visit our Discord (https://discord.gg/dPhv2B3x)!

Otherwise, Atuin is a hobby project - if you find it valuable, you can help us out!

- ⭐️ Give us a star on GitHub (https://github.com/ellie/atuin)
- 🚀 Contribute! We would love more regular contributors (https://github.com/ellie/atuin)
- 🤑 Sponsor me! If you value the project + want to help keep the hosted sync server free (https://github.com/sponsors/ellie)

~ Ellie 🐢💖

上記のinstall.shを実行すると、~/.bashrcの末尾には次の2行が追記されます。

[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
eval "$(atuin init bash)"

Atuinのデフォルトのホットキー「Ctrl+R」と「↑ (カーソルキーの上矢印)」のうち、私は後者は従来通りに使いたいので、~/.bashrcを若干編集して--disable-up-arrowを追加しました。

# Atuin (https://atuin.sh/)
[[ -f ~/.bash-preexec.sh ]] && source ~/.bash-preexec.sh
eval "$(atuin init bash --disable-up-arrow)"

Step-2. Atuinの初期設定と動作確認

Step-1の With the default sync server を続けます。この手順の場合、Atuin同期サーバとしてはデフォルトの、作者の方がホスティングしているサーバを借用することになります (参考: 同期せずにオフラインで利用する方法, 同期サーバをSelf-Hostingする方法)。

最初に次の一連のコマンドで、当該サーバへの自身のアカウントの新規登録を行い、現在のシェル履歴をAtuinにimportし、サーバとの同期を手動実行します。

## 最初の実行 (サーバへのアカウントの新規登録など)
$ atuin register -u <USERNAME> -e <EMAIL> -p <PASSWORD>
$ atuin import auto
$ atuin sync

Atuinの状態を確認すると次のようになります。履歴の同期が実行されていることがわかります。

$ atuin status
[Local]
Sync frequency: 1h
Last sync: 2023-04-25 14:20:37.757696 UTC
History count: 2065

[Remote]
Address: https://api.atuin.sh
Username: <USERNAME>
History count: 152

AtuinのCUI画面を確認してみましょう。「Ctrl+R」を押すと次のようなターミナル全体に広がる画面で履歴の検索が可能になります。上下のカーソルキーで履歴の行を選び (赤色)、リターンキーで選択の確定です (即実行はされません)。また、行頭に数字がある履歴の行はALT+数字 (今回のmacOS環境の場合はOption+数字) を押すと選択できます。

Atuinを単独のシェル環境で利用するだけならば初期設定はここで終わりです。search_modeなどの様々なカスタマイズについてはConfig | Atuinを参照してください。

Step-3. Atuinのkeyを確認

Atuinを2台以上のシェル環境で利用したい場合、複数環境での同期のために、最初にアカウントを新規登録した (1台目の) Atuinのkeyを知っておく必要があります (参考: atuin sync | Atuin > Key)。

ちなみに余談ですが、ここでいうkeyとは、ファイル~/.local/share/atuin/key自体のpathでも、このファイルの中に書かれているハッシュっぽい文字列でもありません。keyとは、次のように、コマンドatuin keyが出力する複数の英単語からなる文字列です (落とし穴その3……orz)。

$ atuin key
abc def ghi jkl mno pqr stu vwx yz...

2台目以降での導入手順

Step-0. 環境確認

今回の2台目として、Atuinを次の環境へ導入します。

項目内容
OSUbuntu 22.04 LTS
シェルbash 5.1.16
ターミナルソフトgnome-terminal

1台目と同様に、bashは最新バージョンであるか、ターミナルソフトでのAltキーの扱いは適切な設定であるか、確認しておきます。

Step-1. Atuinのインストール

1台目と同様に、公式サイトの Getting Started | Atuin に沿って、Atuin (v14.0.1) の導入を進めます。Ubuntu環境では次のように、途中でsudoが実行され、debパッケージでAtuinがインストールされました。

$ bash <(curl https://raw.githubusercontent.com/ellie/atuin/main/install.sh)
(snip)
Detected Linux!
Checking distro...
Ubuntu detected
(snip)
[sudo] hogehoge のパスワード: 
(snip)
/tmp/tmp.D02rO5nH08.deb を展開する準備をしています ...
(snip)

$ apt list --installed atuin
一覧表示... 完了
atuin/now 14.0.1 amd64 [インストール済み、ローカル]

Step-2. Atuinの初期設定と動作確認

1台目の初期設定時にアカウントは作成済みです。そのアカウント情報と1台目のkeyを用いて、次の一連のコマンドで、サーバへログインし、現在のシェル履歴をAtuinにimportし、サーバとの同期を手動実行します。

## 2度目以降の実行 (既存アカウントでログイン)
$ atuin login -u <USERNAME> -p <PASSWORD> -k "abc def ghi jkl mno pqr stu vwx yz..."
$ atuin import auto
$ atuin sync

続いて、Atuinの状態を確認しておきます。

$ atuin status

Step-3. Atuinの同期を確認

Atuinの真骨頂であろう、複数のシェル環境をまたいで履歴の同期が行われるかを実験してみましょう。2台目のシェルで次の操作を行った後に、

## 2台目のシェルで実行
$ atuin status
$ echo "2台目からのテスト"
$ (Ctrl+Rして履歴に上記echo文が含まれていることを確認)
$ atuin sync

最初の1台目のシェルで次の操作を行ってみると、2台目での履歴が1台目にも反映されていることが確認できるものと思います。

## 1台目のシェルで実行
$ atuin sync
$ (Ctrl+Rして履歴に「echo "2台目からのテスト"」が含まれていることを確認)

上記の実験ではatuin syncを行って同期を手動実行しましたが、Config | Atuin > sync_frequency にあるように、デフォルトでは1時間ごとに自動で同期する設定となっています。したがって実際の使用感としては、シェル利用中に知らぬ間に同期している、という印象になるかと思います。

まとめ: ChatGPTへCLIで問い合わせる内容もAtuinで同期できそう

まだ使い始めたばかりですが、あちこちでCLIを使うのが好きな人間 (私) にとって、Atuinはたしかに、マジカルなシェル環境をもたらしてくれる可能性が高いツールだと予想しています。ちゃちゃっと作るワンライナーの履歴を後々別の環境で呼び出せたりするのはまずありがたい。

また私は最近、流行りのChatGPTへの問い合わせを、下記の ShellGPT (shell_gpt) というツールを使ってシェル環境から手早く行ったりしています。そのコマンド (いわばAIに対するプロンプト) も、Atuinの履歴同期によって使い回せるであろうことは確実に効率化に繋がります。

以上、今後のシェル生活で色々楽をするためにAtuinおすすめいたします。

P.S. シェル環境の履歴の同期方法を、思いつきで、ChatGPTへShellGPT経由で聞いてみました。回答にある~/.bash_historyでの履歴同期は正攻法だけども、ファイル単位となるし実用性はどうだろうなぁ。