bashでまだ実行されていない文字列の一部を繰り返すことは可能ですか?

bashでまだ実行されていない文字列の一部を繰り返すことは可能ですか?

同じ行(たとえば、リンク)でコマンドの一部(まだ実行されていない)を繰り返すことができるかどうかを知りたいです。

このコマンドを実行したいとしましょう。

mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /some/long/dest/path 

次のように入力することは可能ですか?

mkdir -p /some/long/dest/path && rsync -azP /some/long/src/path /path/at/x:2

明らかに、x:2配列のインデックスは最後に実行されたコマンドだから、文字列を一緒にリンクしてコマンドを再利用できるかどうか疑問に思います。x現在の文字列位置です。

答え1

行編集を使用してパラメータを取得し、行のmkdir末尾に貼り付けることができます。 (私はvi-styleライン編集を使用するので非常に簡単です。ESCを押して編集モードに入り、そのパスにジャンプし、パスをドラッグして貼り0WW付けます。default -styleライン編集にも同等の機能があるとします。)mkdiryWpemacs

または、

p=/some/long/dest/path; mkdir -p "$p" && rsync -azP /some/long/src/path/ "$p"

それとも対話型セッションなので、mkdir結果を確認してください。検査パス:

mkdir -p /some/long/dest/path
rsync -azP /some/long/src/path/ !$

以前に発生したことがない場合は、最後のコマンドの最後の引数()を!$置き換えることができます。 (他の中から)$にありますman bash。試してみて、どのように進行しているかを確認してください。

date --date tomorrow
echo !$
date --date !$

プロジェクトは最初から参照されますecho !!:0

その主張をどのように引用すべきかわかりません。現在のこのスタイル演算子と一緒にコマンドラインを使用してくださいhistory

答え2

覚えてるほど年をとったハードコピー端末 (子供のためのキーボードを備えたプリンタを想像してみてください。)そして、私はこのエディタスタイルのコマンドライン編集が長続きしない流行だと思います。    :-)

しかし、正直に言うと、わかります人間型命令の歴史を聞いた人は私だけではない!。それはいくつかの詳細で議論されています。 大きな打撃(1);より 歴史部分。以下は簡単な要約です(例:一般形式のヒントをいくつか含む例のリスト)。

文法/
     例
説明/解説
!number;!42 ログイン後42番目の命令です。あるいは、  historyリストの42番目のコマンドを削除または切り捨てると、状況が複雑になります。
!-number!-1、、、     !-2!-42 相対アドレス指定。  !-1は最新のコマンドで、!-2は前のコマンドなどです。  -1デフォルト値は!-1短縮することが!!でき(下記参照)、省略することができます。!-1:something!:something
thing1:thing2 thing1修正されました。 1つのオブジェクトに複数の修飾子がある可能性があります。以下の例をご覧ください。thing2
:number これN最初の単語。 〜のように エマ・ルーオ、単語番号付けは0から始まるので、前のls -l fooコマンド
  • !:0= ls
  • !:1=-l
  • !:2= foo
:$ 最後の言葉。 〜のように エマルオショー説明は必要なく、:$短くして書くだけです$
:h 頭も同じです…dirname
:t 尾;同じです...basename

よく知られていない構造の1つは参考文献  !#です。これ 現在のコマンド  だからあなたの

mkdir -p /some/long/dest/path  &&  rsync -azP /some/long/src/path /some/long/dest/path

コマンドは次のように入力できます。

mkdir -p /some/long/dest/path  &&  rsync -azP /some/long/src/path !#:2

2番目の単語()はどこで!#:2入手できますか?/some/long/dest/pathこれ注文する。

そして、rsync例が示すように、パラメータが実際にほぼ隣接している場合は、さらに一歩進んで次のように言うことができます。

mkdir -p /some/long/dest/path  &&  rsync -azP !#:2:h:h/src/path !#:2

以下は、!#:2:h:h複数の修飾子を持つエントリの例です - dirname(dirname(!#:2))= /some/long。さらに一歩進むこともできます。

mkdir -p /some/long/dest/path  &&  rsync -azP !#:2:h:h/src/!#:2:t !#:2

しかしbasename(!:2)、これが実際に文字通りの" path"ならば、これは実際にはより多くのタイピングを意味します。

関連情報