私の記事「Bashの履歴の解析」では、シェルのhistory内のアイテムを参照する方法を示しました。 行番号と単語の位置で。 Bashのhistoryの解析をマスターしたら 行と単語のインデックスによって、historyで使用できる修飾子を利用できます。 コマンド。
histexpandシェルオプション
 historyについて説明する前に 構文解析では、感嘆符(!)について言及する価値があります。 )表記は、histexpandのおかげで、Bashシェルでのみ使用できます。 オプション。 histexpand はデフォルトで有効になっていますが、多くのユーザーはそれをあまり考慮していません。ただし、これは!の拡張を強制するオプションです。 historyのリストに エントリ。
オプションをオフに切り替えると、この機能が失われます。例:
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo 
 通常、histexpand 非対話型シェル(たとえば、シェルスクリプト)を除いて、デフォルトでオンになっています。 history 速記で失敗する場合は、histexpandをアクティブにすることができます シェルオプションとして、または完全なhistoryを使用する histexpandによって暗示されるコマンド :
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo 
 シェルスクリプトでは、historyをアクティブ化する必要があります historyの場所を指定します 保存できます:
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log 
 histexpandを残す利点 非アクティブ化すると、historyの結果の冗長性が失われます 行動。たとえば、histexpand アクティブ化されると、historyの後に最初にシェルに返されます コマンドは、実行されているものの拡張バージョンです:
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo 
 histexpandを使用 オフに切り替えると、history コマンドは長くなりますが、結果はより簡潔になります:
$ set +o histexpand
$ echo foo
foo
$ !!
foo 
 historyの用途を見つけるかどうか シェルスクリプトではあなた次第ですが、history モディファイアには、場合によっては特に便利ないくつかの興味深いショートカットがあります。
履歴修飾子
 historyへの修飾子 選択範囲はコロンで示されます(: )の後に1つの修飾子文字が続きます。一部の修飾子は他の修飾子と組み合わせることができます。
ファイル名のサフィックス
 引数のサフィックスを削除するには、rを使用します 修飾子。
これはbasenameに似ています 。
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar  9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz
$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1
 
 r 修飾子は超インテリジェントではありません。ファイル名の最後のドットを見つけてサフィックスを切り取ります。これは、ファイルのサフィックスとして考えているものと一致しない場合があるため、basename 柔軟性が向上します。
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar 
 eを使用すると、逆の結果を得ることができます。 修飾子:
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
 ファイル名
 dirnameの単純なバージョン hで利用できます 修飾子:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src 
 そして、その式の反対側はtで利用できます 修飾子:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh 文字列置換
 おそらくhistoryの最も広く役立つ修飾子 文字列置換です。たとえば、混合環境の管理者は、ある時点でこれをRed HatEnterpriseLinuxボックスに入力しました。
$ sudo apt install tmux このような間違いは、文字列の置換で簡単に修正できます:
$ ^apt^dnf
sudo dnf install tmux いくつかのオプションを追加することもできます:
$ ^apt^dnf -y
sudo dnf -y install tmux 
 このhistory 構文はsの省略形です 修飾子。完全な構文は、たとえば、!!:s/apt/dnfです。 したがって、historyの数行前のアイテムに役立ちます。 。便利なコマンドを3つ前に発行し、今すぐ同様のコマンドを実行したいとします。
$ !-3:s/vi/emacs/
sudo dnf install -y emacs 
 sedのように 、この置換はデフォルトで1回だけ発生しますが、gを使用して(リコールする行に関連して)グローバルにすることができます。 修飾子:
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3 安全第一:履歴ドライランを実行する方法
 Returnを押す 変更されたhistoryの後 特に、再実行する行が特に危険なコマンドの間にある場合や重要なファイルに影響を与える場合は、行にストレスがかかることがあります。変更して実行しようとしているコマンドを確認する場合は、pを使用できます。 historyの最後にある修飾子 変更。
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt 
 結果として表示されるコマンドは、historyからの展開されたアイテムです。 、しかし、まだ実行されていません。 Upを押すと、手動で実行できます 矢印またはCtrl+P 、これで解決されました。検証を使用する(p )historyを初めて使用する場合は、一般的に良い考えです。 本番環境でのコマンド。
まとめ
Bashの履歴は、1日中何をしていたかを振り返る場合でも、すでに理解した情報のチャンクを再利用して作業を効率化する場合でも、多くのことに役立ちます。履歴修飾子を使用して練習すればするほど、それらはより便利になります。構文を学習するときに、(注意深く)いくつかの問題に遭遇することを許可してください。すぐに、これまでよりも少ないキー押下でコマンドと引数を呼び出すようになります。
[Red Hat Enterprise Linuxを試してみませんか?今すぐ無料でダウンロードしてください。 ]