bashコマンドラインを効率的に移動するにはどうすればよいですか?


19

そのため、upシェル(OSXまたはUbuntuでのBash、ほとんど)で使用しますが、カーソルの現在の場所のに必要なものがあることを時々知っています。上記の行で完了している行を持つ方法はありますか?打つupleft迷惑です。

を除いてtab、他のトリックもクールです。

以下に例を示します(〜quackのリクエストごと):

入力してmkdir /where/the/hell/is/that/thingから、同じディレクトリにcdします。しかし、今ではmeta-bについて知っています:)


1
明示的な例は素晴らしいでしょう。
いんちきキホーテ

@〜いんちき今の例をやって
ダンRosenstark

1
ここに関連する(重複した)質問があり、かなりいい答えがあります:superuser.com/questions/124336/…–
cregox

回答:


11

これを試して:

mkdir /where/the/hell/is/that/thing

次にalt+ を押します.

お使いのOSや端末に応じて、次のように入力する必要があるかもしれません escそして、.

alt+ 1+ .を押して、特定の前の引数を選択することもでき ます。

これは!!よりもはるかに優れています。これは、実行しようとしているものを実際に見ることができ、とにかくキーストロークが少なくて済むためです。

編集:厳密にはそれはではmetaないaltので、キーボードのセットアップ方法によっては「windows」キーでも動作する可能性があります。


面白い!そのことを知りませんでした。
いんちきキホーテ

2
@ジャスティンこれは素晴らしいです。OSXではメタはエスケープです。
ダンローゼンスターク

OS Xターミナルの@yarには、「設定」->「キーボード」の下に「メタキーとしてオプションを使用する」という設定もあります。
-ThomasW

@ThomasWに感謝します。私は毎日コマンドラインを使用していますが、使用するトリックはほとんどありません。
ダンローゼンスターク

28

これはbashの対話型入力メカニズムであるため、システムのman bash、特にReadlineのセクションを読む必要があります。gnu.orgBashマニュアルには、いくつかのギャップを埋めるのに役立つコマンドライン編集に関する素晴らしいセクションがあります。

デフォルトでは、これらを使用してコマンドライン上を移動できます(ここにいくつかをリストします。完全なリストについてはリンクを参照してください)。

  • Ctrl+ a行の先頭に移動しHomeます(または端末設定に応じて)
  • Ctrl+ e行末に移動しEndます(または...)
  • Meta+ f「単語」を前方に移動します
  • Meta+ b「単語」を後方に移動します

これらを使用して、行からテキスト「kill」(別名「cut」)できます

  • Ctrl+ k現在のカーソル位置から行末までのテキストを削除(「カット」)します
  • Ctrl+ yヤンク(「貼り付け」)カーソルのあるバッファに最近キルされたテキストを戻します

したがって、これらを組み合わせて、繰り返したいコマンドラインのチャンクを選択し、強制終了して、次のコマンドの最後に貼り付けることができます。


さて、それをさらに楽しくするために、bashのHistory Expansionを考えてみましょう。これは、ということである!!ということは、ステューダーの答えは言及します。履歴の拡張は、イベント指定子単語指定子、および修飾子に分類されます。

イベント指定子は次のようになります(完全なリストについてはリンクを参照してください)。

  • ! -履歴置換を開始します
  • !n-bashの履歴リストのn番目のコマンド、いくつかの整数n(ネガでも機能します)
  • !!-先行コマンド。に相当!-1
  • !string- 文字列で始まる最新のコマンド

単語指定子は、イベントから特定の部分を選択します。:イベントを単語指定子から分離するために使用します。単語には、行の先頭から始まる0から番号が付けられ、単一のスペースで区切られて現在の行に挿入されます。

  • $-最後の引数を指定します(たとえば!!:$、最後のコマンドの最後の引数。短縮できます!$
  • n-指定n番目の単語(例えば!str:2最新のコマンドの第2引数が始まるさSTRを!!:0あるコマンド最後のコマンドの)

したがって、例をフォローアップするために、最後のコマンドがの場合、mkdir /some/really/long/path実行!!するだけでそのコマンドが再実行されます。しかし、cd代わりにそのパスにしたい:

$ cd !$

ここで、他のコマンドをいくつか実行し、そのパスを再度参照したいとします。それが最後に実行したmkdirコマンドである場合、これを使用してそのパスを繰り返すことができます。

$ tar czf ~/foo.tgz !mkdir:$

またこれら(および他のReadlineコマンド)を任意のキーの組み合わせにバインドできます。マニュアルのセクション8.4、バインド可能なReadlineコマンド:gnu.org/software/bash/manual/…およびセクション8.3、Readline Initファイル:gnu.org/software/bash/manual/bashref.html#Readline-Init-Fileを参照してください
いんちきキホーテ

本当に助かります。「マニュアルを読む」というのは一種の期待でしたが、バインディングの基本的な動きに言及することは助けになります。ctrl-aを知っているだけでも、本当の節約になります。
ダンローゼンスターク

@quack、問題ありません、実際には後の改訂版を見つけました:)
ダンローゼンスターク

1
また、現在のキーバインドに注意するbind -pか、bind -P印刷します。これは、bashが使用するものの究極のリファレンスです。
いんちきキホーテ

1
この答えは大きくなったと思います。歴史の拡大に関するものは素晴らしいです。
ダンローゼンスターク

6

viユーザーの場合は、を入力してシェルをviモードにできますset -o vi

これで、入力後にコマンドラインであらゆる種類の強力な処理を実行できますEsc + k

私が最も使用するものがありEsc+K、その後/のスラッシュは、コマンドラインの履歴を検索するために使用されます後に入力した任意のテキスト。

たとえばEsc + k /smbclient 、最後に入力したsmbclientコマンドが表示されます。あなたは、標準的なviのキーを使用して、すべての検索をスクロール(することができますjし、k上下のためのが、私は最高だと思うし、上下矢印あまりにも動作します)。

ここでさらに助けてください。また、そのリンクには、探しているものよりも多くの組み込みのbash項目があります。

乾杯、Stu。


viモードは役に立たないが、私はまだviにステップアップしていないので、lインクは素晴らしい。それをありがとう!
ダンローゼンスターク

1
viモードなしの同等のものはctrl-rです。入力してから、前のコマンドの一部を入力します。最後に入力されたものが表示されます。もう一度ctrl-rを押して、次のものに進みます。とても便利な。
Nerdfest

3

!!最後のコマンドを表すwhich を使用できます:

%テスト
% エコー !!
>テスト

面白い。それから...何を使用してその文字列を操作したいのかわかりませんか?
ダンローゼンスターク


2
これは、sudoの使用を忘れた場合に非常に便利です。つまり、sudo !! -$ more / etc / sudoers / etc / sudoers:許可が拒否されました$ sudo !! sudo more / etc / sudoers [sudo] password for ..:#/ etc / sudoers ... ...
...-user9632

@wookiebreath、そのおかげで、私は今すぐこの答えを投票します
ダンローゼン

0

指定した例では、!$を使用して前のコマンドの最後のパラメーターを表します。

mkdir / something / somethingelse

cd!$

番号付きのバリエーションを使用して、前のコマンドの特定のパラメーターを引き出すこともできます。


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