TL; DR: alias @@='$($(fc -ln -1) |& tail -1)'
Bashの履歴相互作用機能は、コマンドの出力を調べるメカニズムを提供しません。シェルはそれを保存せず、履歴展開はあなた自身が実行したコマンド、またはそれらのコマンドの一部専用です。
これにより、最後のコマンドを再実行し、stdoutとstderr(|&
)の両方をコマンド置換にパイプするというアプローチが残ります。heemaylの答えはこれを達成しますが、シェルはエイリアスを展開する前ではなく、展開する前に履歴を展開するため、エイリアスで使用することはできません。
を使用して関数で有効にしても、シェル関数でも履歴展開を機能させることはできませんset -H
。!!
関数内で拡張されることはないだろうと私は疑い、それがどのように拡張されるかはわかりませんが、今はなぜそうでないのか正確にはわかりません。
したがって、非常に少ない入力でこれを実行できるように設定する場合は、履歴展開の代わりにfc
シェル組み込みコマンドを使用して、履歴から最後のコマンドを抽出する必要があります。これには、履歴の展開が無効になっている場合でも機能するという追加の利点があります。
(スーパーユーザーの)bash履歴展開を含むエイリアスの作成に対するGordon Davissonの回答に示されているように、をシミュレートします。これをheemaylのコマンドに接続すると、次の結果が得られます。$(fc -ln -1)
!!
!!
$(!! |& tail -1)
$($(fc -ln -1) |& tail -1)
これは次のように機能します$(!! |& tail -1)
が、エイリアス定義に入れることができます。
alias @@='$($(fc -ln -1) |& tail -1)'
その定義を実行するか、新しいシェルを開始.bash_aliases
または.bashrc
開始してから、@@
(またはエイリアスに名前を付けた)を入力するだけで、最後のコマンドからの出力の最終行を実行できます。
ek@Io:~$ alias @@='$($(fc -ln -1) |& tail -1)'
ek@Io:~$ evolution
The program 'evolution' is currently not installed. You can install it by typing:
sudo apt-get install evolution
ek@Io:~$ @@
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
evolution-common evolution-data-server evolution-data-server-online-accounts
....