どのように `エイリアスsudo!!`を行うことができますか?

どのように `エイリアスsudo!!`を行うことができますか?

sudo !!Bashでエイリアスを設定しようとしています。 'を試しましたが、alias sbb='sudo !!テキストとして解釈して !!印刷します。

sudo: !!: command not found

二重引用符を使用すると、文字列自体の二重感嘆符が変わるため、機能しません。

これを行う方法はありますか?それとも別のエイリアスですか? `

答え1

!!入力すると bash によって拡張されます。エイリアス置換では拡張されません。

history内蔵機能を使用して拡張できます。

alias sbb='sudo $(history -p !!)'

コマンドが単純なコマンド以上の場合(リダイレクトやパイプなど)、sudoでシェルを呼び出す必要があります。

alias sbb='sudo "$BASH" -c "$(history -p !!)"'

答え2

努力する:

alias sbb='sudo $(fc -ln -1)'

私は実際に「どうぞ」という名前を好みます。

alias please='sudo $(fc -ln -1)'

情報:fcbash シェルに組み込まれたコマンドです。以前にインタラクティブシェルに入力したコマンドを一覧表示、編集、再実行します。

!!Zshにはエイリアスと同様の問題があり、fc -ln -1そこでも動作します。 sudo コマンドライン内でリダイレクトやその他のシェル構文のインポートに関する注意事項が適用されますが、コマンドをシェル呼び出しでラップするか、eval次を参照できます。@riciの返信

答え3

今、この目的のためにGitHubにリポジトリがあります。このリポジトリは、スーパーユーザー権限が必要かどうかを魔法のように確認し、ミスも修正します。

https://github.com/nvbn/thefuck

答え4

これはもともと公開されましたこれ質問がありますが、ここに投稿することを提案しました。

同様の置換を実行するためにfcエイリアスを使用する方法は次のとおりです。以下を使用したいとします(ここではhistory!-!-nNは、最後に使用したn番目のコマンドの番号です。)次のエイリアスを使用して、fcおよびを使用できます。history

  1. 使用history:

    alias xyz='echo $(history -p "!-<n>") ; sudo $(history -p "!-n")'
    

    注:これはまたはで囲む!-n必要があります。'''

  2. 使用fc:

    alias xyz='echo $(fc -ln -n -n) ; sudo $(fc -ln -n -n)'
    

    注:ここで、最初2番目は履歴リストの範囲を指定するために使用されます。 -n

ここでは、コマンドを実行する前にecho-ingを使用して!-<n>

関連情報