同じ行(たとえば、リンク)でコマンドの一部(まだ実行されていない)を繰り返すことができるかどうかを知りたいです。
このコマンドを実行したいとしましょう。
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ライン編集にも同等の機能があるとします。)mkdir
yW
p
emacs
または、
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 コマンド
|
:$ |
最後の言葉。 〜のように エマルオショー説明は必要なく、:$ 短くして書くだけです$ 。 |
: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
"ならば、これは実際にはより多くのタイピングを意味します。