シェルの感嘆符は叫ぶためのものじゃない。怠惰であれ
A shell exclamation mark is not for yelling. Be lazy

シェルでの繰り返し作業にうんざりしているあなたへ。bash、csh、tcsh、zshのイベント指定子(!!、!$、!:hなど)を使えば、履歴からコマンドや引数を再利用して、キーストロークを大幅に節約できます。POSIX準拠のシェルなら、fcコマンドでエディタを使ってコマンドを編集・再実行することも可能。この記事では、基本から応用まで、実例を交えて解説します。
感嘆符は叫ぶためのものではない——少なくともシェルの中では。
HNでの議論
75- userbinator
この話題が出るたびに、「ああ、そういえばできるんだった」と思って、すぐに忘れてしまう。特にタイピングが速い人なら、流れを中断する「精神的な分岐」を増やすよりも、やりたいコマンドで「まっすぐ突っ走る」ほうが楽だ。同じ理由で、バックスペースで修正するより、Ctrl+Cしてやり直すこともよくある。
- idoubtit
何十年も前、`!`とその仲間の使い方を、`sudo !!`のトリックが好きなLinuxユーザーから教わった。その後、この暗黙の補間から明示的なショートカットに切り替えて、そうしてよかったと思っている。
下の方のFAQで提案されているように、`!…`の代わりにctrl-rが使える。あるいは、最初の数文字を入力してからalt-pや「上矢印」を使うほうがいいかもしれない。それはより強力で、より拡張性がある。alt-.のような他のショートカットは、過去の引数に移動できる。
上矢印、alt-p、alt-.などを使うと、コマンドラインには実際のコマンドが表示される。`!…`の魔法はエラーが起きやすく、曖昧だ。zshでは、TABを押して魔法を静的なテキストに展開することをお勧めする。
FAQに他の項目も追加したい:`sudo !!`と入力したとき、それはシェルの履歴にそのまま保存されるのか、それとも`!!`の補間後に保存されるのか?コマンドラインをスペースで始めた場合(zshが履歴に保存しないようにするため)、`!…`もその行を無視するのか?`!$`は再帰的か?
- miki123211
IMO、`!$`が一番便利だ(最後のコマンドの最後の引数に置き換わるやつ)。
`!!`は上矢印+Enterで同じくらい簡単にできる。`!ssh`はctrl+rでできるし、実際に何が実行されるか、最後のsshが思っている場所へのものかどうかも表示される。`sudo !!`は上矢印、ctrl+a、'sudo 'で、キーストロークが1つ増えるが、readlineを知っていれば自然だ。残りは複雑すぎて学ぶ価値がない。`!$`がちょうどいいところだ。
- inigyou
これはテレタイプライター向けの話だ。インタラクティブな電子ビデオディスプレイを持つ我々は、上矢印で最後のコマンドを呼び出したり、Ctrl-Rで履歴を検索して、呼び出したコマンドを編集できる。
- Terr_
「かっこいい」とか「便利」という感覚よりも、なぜかコマンドラインの何かが実際に何をするのかを判断するのが、どれほど有機的に複雑なのかという絶望感を感じてしまう。公平に言うと、私はずっと「シェル言語で書くべきなのは最も単純なスクリプトだけだ」という考えに偏っている。
これはまた、シェルコマンドが無害で正しいかどうかをレビュー・検証する際に、興味深い新たな側面を加える。LLMが、私に承認してほしい小さなリクエストの中で、このトリックを(悪用も含めて)使い始めるまで、あとどれくらいだろうか?