私の記事「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を試してみませんか?今すぐ無料でダウンロードしてください。 ]