以前に実行された4つのコマンドシーケンスを実行したいとしましょう。コマンド履歴の最初の項目が432の場合は、次のことができます。
$ !432; !433; !434; !435
これを達成するより効率的な方法があるかどうか疑問に思います。
答え1
最近実行されたコマンドを参照する場合、より効率的なアプローチは負の数で参照することです。
!-4; !-3; !-2; !-1
また、これを行うと、最後の履歴エントリに完全なコマンドチェーンが含まれるため、Repeat itを使用できます!!
。
編集する:
この強力な組み込み機能にまだ慣れていない場合fc
、ザイルズが言及。 (を使用しますhelp fc
。)負の数も使用できることがわかったので、上記の操作を使用できます。
eval "`fc -ln -4 -1`"
しかし、これには注意があります。その後、そのeval
行は最後のコマンドとして履歴に保存されます。したがって、これをやり直すとループに閉じ込められます。
より安全なアプローチは、基本的なfc
作業モードを使用することです。つまり、選択したコマンド範囲をエディタに渡し、終了後に実行します。努力する:
fc -4 -1
コマンド範囲の順序を逆にすることもできます。fc -1 -4
答え2
答え3
Bash レコードから複数のコマンドを順次実行するための良い選択肢があります。
履歴の置き換え(または)を使用する代わりに、!432
+を使用して履歴を検索して実行する最初のコマンドを見つけた後、+(!-4
CtrlrCtrlo対処して次の手順に進みます。)キーの代わりにreturnこれ
コマンドを開始し、次のコマンドを提案します。歴史的に。Ctrl+o好きなだけクリックして、return最後のシーケンスでシーケンスを終了したり、開始せずにCtrl+c停止したりできます。
答え4
fc
forループとxsel
これは、複数回接続して最後のnコマンドを再実行したい場合にうまく機能します。
fcn() (
from="${1:-2}"
to="${2:-1}"
if [ "$from" -ne "$to" ]; then
for i in `seq "$from" -1 "$(($to + 1))"`; do
printf "$(fc -ln -${i} -${i}) && "
done
fi
printf "$(fc -ln -${to} -${to})"
)
それから:
$ echo a
a
$ echo b
b
$ echo c
c
$ fcn 3 1 | xsel -b
$ # Paste.
$ echo a && echo b && echo c
a
b
c
$ # Paste again if you feel like it.
$ echo a && echo b && echo c
a
b
c
または、いくつかの編集が必要な場合があるより大きなコマンドの場合:
fcn 3 1 >cmds.sh
vi cmds.sh
bash cmds.sh
bash cmds.sh