回答:
!!
単独で実行すると、に保存されているように以前のコマンドが実行されますhistory
。また、やって!-1
、!-2
などようにあなたの最後のコマンド、最後から二番目のコマンド、およびを実行します。ハンディ!
!<command>
から最後のイベントを実行~/.bash_history
します<command>
!
コピーされたこの愚かなbashのものは、これtcsh
までにないほど何度も私を台無しにしました。二重引用符は、の解釈から保護しません!
。 $ foo "!bar"
-> !bar: event not found
。
答え:sudo !!
昇格した特権で前のコマンドを繰り返すために、すぐに入力します。
編集:redditで 見つかった画像。これは、Randall Munroeによるオリジナルの xkcdコミックのパロディです。
上矢印キーを使用して、古いコマンドをスクロールし、それらを書き換え/変更して、sudo
それらの前に追加できます。(矢印キーの上のホームボタンは、位置を先頭に設定します。)
私はこのsudo !!
アイデアが嫌いです。なぜならあなたは時々別のコマンドを追加して、もう覚えていないからです。
sudo !!
と、シェルが展開さ!!
れ、実行しようとしているコマンドを確認できます。そのため、Ctrl-Cを押して正しいコマンドを見つけるのはいらいらするかもしれませんが、少なくとも気付かないことはありません。
!!
sudo !!<TAB>
で自動補完さ!!
れます。BashはM-^
(私にとってはalt + shift + 6)で履歴を拡張できますが、それはそれほど流ではありません(ただし、これを再バインドできます)。また、がありshopt -s histverify
、履歴展開を使用してEnterキーを押すと、代わりに展開を表示する別のプロンプト行が表示され、編集することができます。
shopt -s histverify
少しも助けにはなりません。ほとんどの人はEnter
二度打つことに慣れるでしょう。その時点で、彼らは何が起こったのかを確認するにはまだ手遅れです。
私は単に代替手段を追加します。入力するのと同じくらい短く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つとしてカウントします...)が、「上矢印」を追加すると、履歴内のどのコマンドでも実行できます。
set -o vi
)も使用できます。次に、エスケープ(コマンドモードに移動)してから、「I」(大文字の「i」、行頭に挿入)を実行できます。
この質問は、「同じコマンドを実行し、多少の修正を加えて」に一般化できます。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
)はあなたの友達です。
私は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で同じことを行う方法を見つけることができませんでした。
私が好む方法:
しかし、単に「sudo !!」を実行する方が簡単かもしれません、それはあなた次第です。