履歴コマンド

履歴コマンド

ターミナルでは、(どの回答も bash や他のほとんどのシステムでは機能すると期待していますが) 何らかのコマンドを入力すると、 が見つからないために何らかの権限エラーが発生することがよくありますsudo

はい、それでは「上」を押して、「左」を押したまま/ハンマーで叩き、入力しsudoて「Enter」を押します。

イライラします。コマンドが長ければ長いほどイライラします。

抜け落ちはsudo最悪のケースであることに注意してください。末尾よりも先頭に近い位置での誤字も同様に迷惑です。

私が欲しいのは、一種の「上矢印キーとホームキー」のキーストロークを実行する方法です。実際、おそらくこの 2 回のストロークでそれが実現できるでしょう。しかし、私の Macbook キーボードにはホームキーがないので、試すことができません。

sudoCMD+Shift+S など、自動的に挿入して Enter キーを押す方法があれば、さらにポイントが上がります。


これは実現可能でしょうか、それとも夢を見ているのでしょうか?

答え1

UPと を使用するだけですCTRL-A

どちらも!sudo機能sudo !!は簡単です。違いは次のとおりです。

  • sudo !!sudo先頭の 履歴から取得した最後のコマンドを実行します。

  • !sudoは、 で始まる履歴内の最後のコマンドを実行しますsudo

  • 通常、CTRL-ALinuxターミナルの行の先頭からCTRL-E末尾まで移動します。
    必要に応じて、戦略を引き続き使用できます。システムのショートカットを見つけるだけです。ショートカットグラフィックとテキストの環境例えばここ

わずか警告:sudo !!そして!sudo本当に速く機能し、スーパーユーザーとして実行している行を視覚的に制御することはできませんこれによって有害時々。特に誤植が発生した場合。

劇的な例を挙げてみましょう:

cd $HOME/Directory_To_Delete  # You go to delete what is inside a directory
rm -rf . ; cd ..              # You do it and go up of one
 apt-get update               # Note the space in the beginning of the line  
sudo !!                       # Gone!! Now you realize you never really wanted 

ホームディレクトリとすべてのサブフォルダを消去してしまいました。手遅れです!!

最初の文字にスペースを含むコマンドを記述すると、履歴に残らない可能性があります。これは変数$HISTCONTROLの値に依存します。その値のリストに無視スペース(または両方を無視) スペース文字で始まる行は履歴リストに保存されません。したがって、sudo !! を使用すると、直前のコマンドが実行されます。

でも同様の状況が考えられます。 は!sudo、履歴に記録された で始まる最後のコマンドを実行しますsudoが、記憶している最後のコマンドがスペースで始まっていた場合は、別のコマンドを使用することになります。

最後に注意: あなたの間違いはそれほど劇的ではありません。それはあなたが気付かないうちに通り過ぎる可能性があるため、より狡猾である可能性があります...そして、あなたが覚えていない請求書の利息をすべて支払うよう求められるリスクがあります。


更新 (Bash は素晴らしい):
最近のバージョンの Bash では、ファイルに追加することをお勧めする次のコマンドを使用して、この危険な動作を修正できます~/.bashrc

shopt -s histverify

ここからman bash読むことができます

もし、履歴を確認するシェルオプションが有効になっており、読み込まれた行使用されている、履歴置換はすぐにはシェル パーサーに渡されません。代わりに、展開された行は、さらに変更するために readline 編集バッファに再ロードされます。

実行するコマンドを読み取り、必要に応じて変更することができます。
多くのディストリビューションではデフォルト設定ではないため、他のアカウントを使用する場合でも、それを覚えておく必要があります。

答え2

多くの Mac および Linux プログラムで使用される一般的なキーボードの組み合わせをいくつか示します (ただし、ほとんどの Windows アプリで使用されているかどうかはわかりません)。

  • CTRL-A- カーソルを現在の行の先頭に移動します
  • CTRL-E- カーソルを現在の行の末尾に移動します
  • CTRL-Left- カーソルを1単語分戻す
  • CTRL-Right- カーソルを1単語分前進させる

答え3

使用

sudo !!

!!前の完全なコマンドに置き換えられます。

答え4

@WChargin は に関して正しいので!sudo、回答を変更します...

sudo !!多くの人が言っているように、これが正解です。

history念のため、コマンドとそのコマンドの動作について、次の内容をここに貼り付けます!。お役に立てば幸いです。


履歴コマンド

history コマンドを使用すると、入力したコマンドの Bash ログを一覧表示できます。

このログは「履歴」と呼ばれます。アクセスするには次のように入力します。

history n 

これによって、最後の n コマンドのみがリストされます。履歴リスト全体を表示するには、「history」(オプションなし)と入力します。

次のように入力することもできます!nコマンド番号nを実行するには、!!最後に入力したコマンドを実行します。

!-nこのコマンドをn回実行します(言い換えると!-1は以下と同等である!!)。

!stringその「文字列」で始まる最後のコマンドを実行し、 !?string?「string」という単語を含む最後のコマンドを実行します。例:

!cd「cd」で始まる最後に入力したコマンドを再実行します。

commandName !*最後のコマンドで使用した引数を使って「commandName」を実行します。これは、たとえばスペルミスをした場合などに便利です。次のように入力した場合:

emasc /home/fred/mywork.java /tmp/testme.java 

上記の 2 つのファイルに対して emacs を実行しようとすると、明らかに失敗します。そのため、次のように入力します。

emacs !* 

これにより、コマンドラインで最後に入力した引数で emacs が実行されます。言い換えると、これは次のように入力するのと同じです。

emacs /home/fred/mywork.java /tmp/testme.java

コマンドライン履歴

関連情報