以前に実行した4つのコマンドのシーケンスを実行するとします。最初のコマンドがコマンド履歴で432であれば、次のようにできます。
$ !432; !433; !434; !435
私は興味がありますが、これを達成するためのより効率的な方法はありますか?
以前に実行した4つのコマンドのシーケンスを実行するとします。最初のコマンドがコマンド履歴で432であれば、次のようにできます。
$ !432; !433; !434; !435
私は興味がありますが、これを達成するためのより効率的な方法はありますか?
回答:
最近実行されたコマンドを参照している場合、より効率的な方法は負の数でそれらを参照することです:
!-4; !-3; !-2; !-1
また、一度実行すると、最後の履歴エントリにはコマンドチェーン全体が含まれるため、で繰り返すことができます!!
。
編集:
あなたがまだの場合は、偉大な組み込み機能に慣れfc
、ジルが言及しました。(help fc
。を使用します。)負の数も使用できるため、上記と同じことができます。
eval "`fc -ln -4 -1`"
ただし、これには注意点が1つあります。この後、eval
行は最後のコマンドとして履歴に保存されます。これを再度実行すると、ループに陥ります!
これを行うより安全な方法は、デフォルトのfc
操作モードを使用することです。選択した範囲のコマンドをエディターに転送し、終了後にコマンドを実行します。試してください:
fc -4 -1
コマンドの範囲の順序を逆にすることもできます。 fc -1 -4
man fc
私に何も与えてくれません。何のfc
略ですか?他にどんなオプションがありますか?
help fc
...およびhelp help
.... help:help [-dms] [pattern ...]組み込みコマンドに関する情報を表示します。
-l
フラグがなければ、悪を必要とせずに実行されeval
ます。
Bash履歴から多数のコマンドを順番に実行するための便利な代替方法があります:
履歴置換(!432
または!-4
)を使用する代わりに、Ctrl+ rで履歴を検索し、最初のコマンドを見つけたら実行、キーの代わりにCtrl+ o(operate-and-get-next)をreturn押す
これにより、コマンドが起動され、履歴から次のコマンドが提案されます。あなたはヒットすることができますCtrl+oあなたが望むように多くの時間と、のいずれかでシーケンスを終了return最後のもののために、またはCtrl+cそれを起動せずに停止します。
Ctrl-o
たらリテラル^o
を出力して、を壊します(reverse-i-search)
。他の設定が関係しているのかもしれません。
コマンドを編集するのではなくすぐに実行するために、evalを使用したGilesの回答の構文的にスリムなバージョンを次に示します。
fc -e: 432 435
-eのコロン引数はbash noopであり、fcが必要とする「エディターで開く」ステップをスキップする効果があります。また、(最近の)履歴には、evalステートメントではなく、履歴からの実際のコマンドが含まれるようになりました。
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
history -p \!43{2..5}
後続のコピー/貼り付けに適した端末に印刷できます。