ルートとして同じコマンドを再度実行します


117

コマンドを実行するときに、十分な許可を得るためにスーパーユーザーとして実行する必要があることに気付かないことがあります。

スーパーユーザーとして同じコマンドを再度実行する方法はありますか?

回答:


196

最も簡単な方法は次を実行することです:

sudo !!

これにより、最後のコマンドがスーパーユーザーとして実行されます。

ソース


5
これは非常に有用であることがわかったので、これに出くわしたことはありませんでした(一般的な知識かもしれませんが)。サイトで見つけることができなかったので、自分で答えると思いました。
-Trufa

30
余談ですが、!!単独で実行すると、に保存されているように以前のコマンドが実行されますhistory。また、やって!-1!-2などようにあなたの最後のコマンド、最後から二番目のコマンド、およびを実行します。ハンディ!
oaskamay

6
別として、その開始!<command>から最後のイベントを実行~/.bash_historyします<command>
ラドゥラデアヌ

1
ctrl-rも非常に便利です。入力した内容に一致するコマンドを履歴内で後方に検索します。これにより、コマンドを再実行する前に編集できるようになります
-KayEss

4
!コピーされたこの愚かなbashのものは、これtcshまでにないほど何度も私を台無しにしました。二重引用符は、の解釈から保護しません!$ foo "!bar"-> !bar: event not found
カズ

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ここに画像の説明を入力してください

答え:sudo !!昇格した特権で前のコマンドを繰り返すために、すぐに入力します。

編集:redditで 見つかった画像。これは、Randall Munroeによるオリジナルの xkcdコミックのパロディです。


3
コメントで賛否両論の会話をしないでください。メリットなどを議論したい場合は、メタを使用してください。ありがとう。
fossfreedomの

17

上矢印キーを使用して、古いコマンドをスクロールし、それらを書き換え/変更して、sudoそれらの前に追加できます。(矢印キーの上のホームボタンは、位置を先頭に設定します。)

私はこのsudo !!アイデアが嫌いです。なぜならあなたは時々別のコマンドを追加して、もう覚えていないからです。


1
幸いなことに、を実行するsudo !!と、シェルが展開さ!!れ、実行しようとしているコマンドを確認できます。そのため、Ctrl-Cを押して正しいコマンドを見つけるのはいらいらするかもしれませんが、少なくとも気付かないことはありません。
リード

4
それはまで拡大していないだろう@Reid 、あなたが入力したヒット、そしてあなたがもう一度パスワードを入力する必要はありません、そのウィンドウ内なら、それは確認なしで実行されます。盲目的に使用する代わりに履歴を使用するための+1!!
Izkata

5
@Iskata:それは本当だと思う。私はzshを使用しているので、入力するだけsudo !!<TAB>で自動補完さ!!れます。BashはM-^(私にとってはalt + shift + 6)で履歴を拡張できますが、それはそれほど流ではありません(ただし、これを再バインドできます)。また、がありshopt -s histverify、履歴展開を使用してEnterキーを押すと、代わりに展開を表示する別のプロンプト行が表示され、編集することができます。
リード

1
私はコマンドを入力し、コマンドが許可を拒否したことを返し、sudo、押し上げる、家に帰る、sudoを入力するプロセスとして同じコマンドをもう一度実行したいという状況をもっと考えていました私には遅い。それは私が永遠にそれをやってきた方法であり、非効率だと感じました。
トルーファ

@Reid:shopt -s histverify少しも助けにはなりません。ほとんどの人はEnter二度打つことに慣れるでしょう。その時点で、彼らは何が起こったのかを確認するにはまだ手遅れです。
フランククスターズ

13

私は単に代替手段を追加します。入力するのと同じくらい短くsudo !!、より柔軟です:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

キーストロークの数はまったく同じです(「ctrl + A」を1つとしてカウントします...)が、「上矢印」を追加すると、履歴内のどのコマンドでも実行できます。


1
ctrl + Aはemacsバインディングからのもので、viバインディング(set -o vi)も使用できます。次に、エスケープ(コマンドモードに移動)してから、「I」(大文字の「i」、行頭に挿入)を実行できます。
ゲルハルトバーガー

1
@GerhardBurger:私は知っているが、、不気味、私は大好き複数行の文書が編集するためのVIを(特にVIM)が、私は多くのシェルに結合emacsのを好むん(シェルにはないモードを編集するためのコマンドから切り替えること本当に理にかなっている、imo、およびemacsのショートカットは、たとえそれほど強力ではなくても、日常の使用には十分です)
オリビエデュラック

確かに、完全を期すために追加しましたが、私にとっては同じですが、「/」で検索すると非常に便利です;)
ゲルハルトバーガー

@GerhardBurger:viモードの "/"について、通常の(emacsバインディング)bashには、いくつかの文字を入力してから「ctrl + r」を入力することで以前のコマンドを見つける非常に便利な方法もあります
Olivier Dulac

7

これを行うにはいくつかの方法があります

  • コマンドのsudo前に追加してコマンドを再度入力するだけです

  • を押しUp arrowて最後のコマンドを取得し、そのsudo前に置きます。

  • 入る sudo !!

!!最後に入力したコマンドに展開されます。コマンドラインの履歴を使用して、他のことでも同様のことができます。こちらをご覧ください


7

この質問は、「同じコマンドを実行し、多少の修正を加えて」に一般化できます。Unixの優れた設計決定の1つは、シェルで一度実行されるものをシェルから呼び出される任意のコマンドで活用できるからです。

言い換えれば、このトリックは適用されないだけsudo

  • 前のコマンドをスーパーユーザーとして繰り返します(sudo !!
  • 前のコマンドを繰り返して時間を計る(time !!
  • 別の環境で前のコマンドを繰り返します(env A=b B=z !!
  • 前のコマンドを繰り返します(!!

履歴展開(履歴置換とも呼ばれる)は、以前のコマンドを簡単に(キーストロークを少なくして)繰り返すための単なるシェル機能です。シェルのmanページでを確認してくださいhistory expansion。たとえば、履歴を使用して実行できる多くのトリックとショートカットについて説明します。

前のコマンドを番号で参照できます:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

前のコマンドで個々の単語を参照できます。

some-command !$     # run some-command on the last arg of previous command

繰り返す前に検索することもできます:

!?awk               # repeat the last command including the string 'awk'

履歴を検索して、何かを他のものに置き換えることができます。

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

さらに、コマンドの選択、引数の選択、検索、置換を個別に組み合わせることができるためです。

シェルのmanページ(この場合man bash)はあなたの友達です。


1
ブリリアント!その答えが受け入れられるべきです。
エリランマルカ

5

私はbashの代わりにzshを使用し、これをmy ~/.zshrcに持っているので、Alt+を押してコマンドラインの先頭にS挿入sudoします:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

残念ながら、bashで同じことを行う方法を見つけることができませんでした。


3
GNU Readlineを使用してBashで簡単に同じことができます:に追加する~/.inputrc "\es":"\C-asudo "と、長い行の先頭に移動し、を押す sudoが行の先頭に挿入されalt-sます。ターミナルを再起動するか、再読み込み~/.inputrcして動作させます。


1
su -c "!!"

sudoでrootになる権限がない場合、またはsudoプログラムがシステムにインストールされていません。


1

私が好む方法:

  • 上矢印キー
  • ホーム
  • 「sudo」
  • 入る

しかし、単に「sudo !!」を実行する方が簡単かもしれません、それはあなた次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.