シェル環境での履歴管理を “magical” にしてくれるというツール「Atuin」を見つけたので、試してみました。
Over the weekend, I released @atuinsh v14! 🚀
— Ellie Huxtable (@ellie_huxtable) April 3, 2023
Sync and search your shell history on all of your machines
Notes: https://t.co/o6mFqvtil3
Some highlights:
- History deletion cross-machine
- Support for @jntrnr's @nu_shell
- Support for Windows
- Inline search UI
Atuinは、ターミナル画面からCtrl+Rで呼び出して使うシェル履歴管理ツールです (Ctrl+Rはシェル標準と同じキー)。履歴をEnd-to-Endで暗号化した上でクラウド同期する機能があり、複数のシェル環境をまたいで自身の履歴の使い回しができそう……というところに惹かれました。公式サイトは下記の通り。
今回、Atuinを導入する1台目の環境は次の通り。
項目 | 内容 |
---|---|
OS | macOS Monterey 12.6.3 |
シェル | bash 5.2.15 |
ターミナルソフト | iTerm2 |
私が激しくハマった2つの落とし穴と事前回避策を、最初に Step-0 として記述します。
たとえば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
を選択&入力します。
今回の環境に固有の問題なのかもしれませんが、iTerm2の初期設定状態ではAtuinでのAltキーがうまく働きませんでした (落とし穴その2……orz)。そこで事前にiTerm2の設定の Preferences > Profiles > Keys を次のように変更しておきます。(参考: Alt-N jump back doesn’t work on MacOS · Issue #417 · ellie/atuin)
設定項目 | 変更前 | 変更後 |
---|---|---|
Left Option Key | Normal | Esc+ |
Right Option Key | Normai | Esc+ |
公式サイトの Getting Started | Atuin に沿って、Atuin (v14.0.1) の導入を進めます。ここではQuickstartの With the default sync server の手順を実行します。すると、macOS環境では次のようにbrew経由でAtuinがインストールされました。
## 事前に内容確認
$ curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh | less
## インストール実行
$ bash <(curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.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-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を参照してください。
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台目として、Atuinを次の環境へ導入します。
項目 | 内容 |
---|---|
OS | Ubuntu 22.04 LTS |
シェル | bash 5.1.16 |
ターミナルソフト | gnome-terminal |
1台目と同様に、bashは最新バージョンであるか、ターミナルソフトでのAltキーの扱いは適切な設定であるか、確認しておきます。
1台目と同様に、公式サイトの Getting Started | Atuin に沿って、Atuin (v14.0.1) の導入を進めます。Ubuntu環境では次のように、途中でsudoが実行され、debパッケージでAtuinがインストールされました。
$ bash <(curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.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 [インストール済み、ローカル]
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
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時間ごとに自動で同期する設定となっています。したがって実際の使用感としては、シェル利用中に知らぬ間に同期している、という印象になるかと思います。
まだ使い始めたばかりですが、あちこちでCLIを使うのが好きな人間 (私) にとって、Atuinはたしかに、マジカルなシェル環境をもたらしてくれる可能性が高いツールだと予想しています。ちゃちゃっと作るワンライナーの履歴を後々別の環境で呼び出せたりするのはまずありがたい。
また私は最近、流行りのChatGPTへの問い合わせを、下記の ShellGPT (shell_gpt) というツールを使ってシェル環境から手早く行ったりしています。そのコマンド (いわばAIに対するプロンプト) も、Atuinの履歴同期によって使い回せるであろうことは確実に効率化に繋がります。
以上、今後のシェル生活で色々楽をするためにAtuinおすすめいたします。
P.S. シェル環境の履歴の同期方法を、思いつきで、ChatGPTへShellGPT経由で聞いてみました。回答にある~/.bash_history
での履歴同期は正攻法だけども、ファイル単位となるし実用性はどうだろうなぁ。
AtuinのTwitterアカウントにて、“hosted sync server” とv14系との同期を停止した旨のアナウンスが2023-06-19 03:29 (JST) に出ています。この影響を受けて、“hosted sync server” を利用している私の環境でもv14系での同期が行えなくなっていたので、v15系への手動更新を行いましたところ、同期機能が復旧しました。
なお、Atuin v15.0.0はその売りである同期機能に変更が入ったもので、2023-05-29にリリースされています。
Just to let you know that I have blocked Atuin v14.0.1 from syncing via the hosted sync server.
— Atuin (@atuinsh) June 18, 2023
We had a small regression (since fixed!) that can cause sync to never complete under certain circumstances.
Please upgrade to v15.0.0! https://t.co/oIwZv4FIK6
Atuin v14.0.1 でloginができなくなっていた端末、確かに、v15.0.0 へ更新するとloginと"hosted sync server"とのsyncに成功した。
— Masahiko OHKUBO (@mah_jp) June 19, 2023
更新は、インストールと同様の次のことをすると行えた。
$ bash <(curl https://t.co/I6dz6dEMhK) https://t.co/RcEpMzY4ot
「中身はラズパイなuConsole CM4上でもAtuin使いたいよなぁ」と思って調べてみたところ、数日前にリリースされたv16でARM (aarch64) 用バイナリが提供されるようになっておりました。なんというグッドタイミング。All future releases will have ARM binaries available.
だそうです。
最新の標準インストール方法 bash <(curl https://setup.atuin.sh)
は現状aarch64環境では転けてしまうようですが、Releasesからダウンロードするアーカイブには下記のようにatuinのARM用バイナリが含まれているので、このファイルにPATHを通して使えば良いようです。
$ wget https://github.com/atuinsh/atuin/releases/download/v16.0.0/atuin-v16.0.0-aarch64-unknown-linux-gnu.tar.gz
$ tar xvf atuin-v16.0.0-aarch64-unknown-linux-gnu.tar.gz
$ cd atuin-v16.0.0-aarch64-unknown-linux-gnu/
$ ls -al
total 15772
drwxr-xr-x 3 mah mah 4096 Aug 10 02:01 .
drwxrwxr-x 4 mah mah 4096 Aug 10 02:01 ..
-rw-r--r-- 1 mah mah 1071 Aug 7 19:42 LICENSE
-rw-r--r-- 1 mah mah 7978 Aug 7 19:42 README.md
-rwxr-xr-x 1 mah mah 16125376 Aug 7 19:42 atuin # これが実行ファイル
drwxr-xr-x 2 mah mah 4096 Aug 7 19:42 completions
Atuin v16 is out now! Sync and search your shell history, across all of your machines ✨https://t.co/qBFYuBPAzt
— Ellie Huxtable (@ellie_huxtable) August 7, 2023
Thank you so much to all the contributors (21!), both returning and new 💖
ARM releases are now built! I bought a M1 mini and it now runs CI under my desk🚀 pic.twitter.com/s1xN4svHoz