Bashでコマンドの一部だけを繰り返す方法は?

Bashでコマンドの一部だけを繰り返す方法は?

繰り返しが可能かどうか知りたいです。部分コマンド。言い換えれば、これを行うと、ls /path/to/somewhere -a削除するだけです。ls-a

!!これにより、前のコマンドが繰り返され(以前に作成されたコマンドに最後のコマンドが追加されます)、これは文字列の最後の部分が含まれることを知っていますが、知りたいのですが!$。たとえば、前のコマンドの中間部分のみを再利用できます。

答え1

もちろん、使用!^

例えば

$ ls /path/to/somewhere -a
ls: cannot access '/path/to/somewhere': No such file or directory
$ echo !^
echo /path/to/somewhere
/path/to/somewhere
$

または(追加のキー入力のため)を使用できます!:1

$ ls /path/to/somewhere -a
ls: cannot access '/path/to/somewhere': No such file or directory
$ echo !:1
echo /path/to/somewhere
/path/to/somewhere
$

これはイベントインジケータそして単語インジケーター部分bash マニュアルページ

答え2

拡張@スティーブの答え一般要件を満たすには:

前のコマンドの中間部分だけを再利用できるかどうか疑問に思います。

複数の単語範囲を使用して、前のコマンドを並べ替えることができます。

  • !:x、x番目の単語を復元するには、最初の単語が0番目の単語です。
  • !:x-y、x番目の単語からy番目の単語まで復元

たとえば、

$ ls /foo /bar -a /baz >/dev/null 2>&1
$ echo !:1-2 !:4
echo /foo /bar /baz
/foo /bar /baz

リダイレクト演算子は次のように計算されます。個人のだから:

$ ls /foo >/dev/null 2>&1
$ echo !:3 !:2
echo /dev/null >
bash: syntax error near unexpected token `newline'

索引による単語の選択は、最新のコマンド以外のコマンドに適用するようにさらに拡張できます。

  • !-n、n番目の最新コマンドを選択
  • !string、次に始まる最新のコマンドを選択してください。string

したがって、これらを組み合わせると、次のような結果が得られます。

$ cat /foo -vet >/dev/null 2>&1
$ ls /bar -a >/dev/null 2>&1
$ cp !cat:1 !ls:1-2 >/dev/null 2>&1
cp /foo /bar -a

私はコマンド履歴を配列(コマンドライン、単語列)と考える傾向があり、これはこの種のナビゲーションを自然にします。

注:前のコマンドの一部をリンクして新しいコマンドを作成すると、そのコマンドが元に戻せない影響があります。:pビルドされたコマンドを呼び出す代わりに、パラメータを入れて表示することをお勧めします。

たとえば: rm !ls:1-4:p最後コマンドrmの最初から4番目の引数まで挿入し、最後のコマンドを印刷します。ls

答え3

バッシュには一つがありますyank-last-argコマンド履歴処理コマンド:

yank-last-arg (M-. または M-_)

前のコマンド(前の履歴項目の最後の単語)に最後の引数を挿入します。数値パラメータの場合、動作はまったく同じですyank-nth-arg。連続呼び出しはyank-last-arg履歴リストから後方に移動し、各行の最後の単語(または最初の呼び出しの引数として指定された単語)を順次挿入します。これらの連続呼出しに与えられる数値引数は、記録が移動される方向を決定する。引数を否定すると、記録の方向(後方または前方)が切り替わります。履歴拡張ツールは、!$履歴拡張が指定されたかのように最後の引数を抽出します。

主キーバインディングでは、を押して有効にできますMeta.。 1最後のコマンドの最後の単語をカーソル位置にコピーします。

コピーするN最後の単語の代わりに最初の単語を押してから、Metan押しますMeta.

探してみると、これより歴史的拡張、インタラクティブに動作するためです。


前のコマンドを対話式に調整するもう1つの方法は、次を使用することです。edit-and-execute-command特徴:

コマンドの編集と実行(Cx Ce)

現在のコマンドラインからエディタを呼び出し、結果をシェルコマンドとして実行します。 Bashは$VISUAL$EDITORおよびエディタを順番に呼び出そうとします。emacs

上/下矢印キーを使用してコマンドを呼び出し、からを押しますCtrlXCtrlEその後$EDITOR、必要に応じてコマンドを編集し、エディタを保存して終了すると実行されます。


1キーボードレイアウトによってはMeta、キーを押し続けるかAltOptionキーを押し続けているか、Escキーを押してから離すことを意味します。.ここで読むのが難しい場合に備えて、ピリオドまたはピリオド文字です。

答え4

上矢印。その後、backspaceいくつかの文字を削除します。Ctrl+A行の先頭に移動してDEL一部の文字を削除します。全体的に視覚的なフィードバックが提供され、推測は必要ありません。Ctrl+E行末に戻ります。

関連情報