web-dev-qa-db-ja.com

スクリプトやエイリアスでbashのbangコマンド(例: '!!')を使用しますか?

Bashスクリプトおよびbashエイリアスで、いわゆるbangコマンド(! +コマンド/シンボル、たとえば!!または!$:p)を使用することはできますか?

行を追加したかった

alias getit='Sudo apt-get install !!'

~/.bashrcファイルに、コマンド自体の呼び出しが失敗した後にgetitと入力して、ツールの動作と同様に、見つからないコマンドをインストールできるようにします The Fuck =、あまり宣誓しないで...

ただし、次の出力に見られるように、この行は機能しません。

$ cowsay
The application »cowsay« is currently not installed.
You can install it by typing:
Sudo apt-get install cowsay

$ getit
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package !!

$ 

最初のコマンドの出力をドイツ語から翻訳したことに注意してください。LANG=Cはその上で機能しませんでした...何らかの理由で。

とにかく、エイリアス内のbang-commandは、最後に実行されたコマンドで置き換えられるように解釈されず、同じ文字列のままであることがわかります。 bangコマンドは通常、対話型シェル内でのみ機能するため、スクリプト内では機能しないことが既にわかっています。

!!がスクリプト内で最後に実行されたコマンド文字列として解釈されるように、この設定を変更できますか?エイリアスはどうですか、そこでは可能ですか?

6
Byte Commander

履歴の展開はエイリアス展開の前に行われるため、historyビルトインを使用して展開を自分で実行する必要があります。

alias getit='Sudo apt-get install $(history -p !!)'

ただし、上記のエイリアスは最後に実行されたコマンド全体をSudo apt-get installの引数として使用します。つまり、失敗したコマンドに引数(cowsay "Hello"など)を与えた場合、この引数も表示されます。インストールするパッケージのリスト(Sudo apt-get install cowsay "Hello")。

これは意図されていないため、エイリアスをsteeldriverのように変更し、!:0の代わりに!!を使用して、最初のWord(コマンド名)のみを取得する必要があります。

alias getit='Sudo apt-get install $(history -p !:0)'

失敗したコマンド名とそのパッケージ名が等しい場合にのみ、この手順が機能するように注意する必要があります。例えばパッケージlynx-curに含まれているため、コマンドlynx(CLIブラウザー)では機能しません。

10
muru