スクリプトのBash記録: `!#:*`

スクリプトのBash記録: `!#:*`

私は読んでいたLPIC-1学習ガイド

echo "This is a sentence. " !#:* !#:1->text3

echo上記のコード行がどのようにコマンドを何度も繰り返すことができるかはわかりません。記録機能を使用していることを知っていますが、またはに関する文書がbash見つかりません。誰かが私にこれを説明できますか?!#:*!#:1

答え1

はい、これは履歴を使用することです。  !#歴史的出来事指標 これまでに入力したコマンドライン全体を意味します。  :*は、ゼロ番目の単語を除くすべての単語を指す単語(範囲)表示です。したがって、 を入力すると拡張さecho "This is a sentence. "れます。そして(これは!#:*"This is a sentence.  "x-yXそしてワイは整数)は、単語数を表す単語(範囲)表示です。X単語水路ワイ。もしワイx-)を省略すると、単語数を表すものと解釈されます。X2番目の言葉で。だから「今まで入力した完全なコマンドライン」以降

echo "This is a sentence. " "This is a sentence. "

これ!#:1-で拡張されます"This is a sentence. "。引用符付きの各"This is a sentence. "文字列は単語として計算されるため(単語番号1のみ)!#:1-と同じです。!#:1だからあなたは結局

echo "This is a sentence. " "This is a sentence. " "This is a sentence. " >text3

-コマンドにtheとtheが一緒に表示されるという事実は、>混乱の問題にすぎません。そして「これは文章だ」という事実。引用すると、何が起こっているのか曖昧になります。

echo This is a sentence. !#:* !#:1-

次に拡張される予定です。

echo This is a sentence. This is a sentence. !#:1-

だから

echo This is a sentence. This is a sentence. This is a sentence. This is a

!#:1-単語1から最後から2番目の単語まで拡張されるからです。)

答え2

Peter Kruminsのbash履歴チートシートに関する良いドキュメントを見つけることができます。ここ

さて、ご理解いただきましたので、 とについて!#説明します。:*:1

  • *:0番目の単語を除くすべての単語を示します。
  • x-: x から末尾から 2 番目の単語までの単語を示します。

したがって、あなたのコマンドは次のようになります。

echo "This is a sentence. " !#:* !#:1-
  • !#:*0番目を除くすべてを取得するには、コマンドを取得するには、次のよう"This is a sentence. "にします。echo 「これは文章です」 」

  • !#:1-1から2番目の単語、最後の単語まで、これは"This is a sentence. "コマンドが次のようになることを意味します。echo 「これは文章です」 「これは文章です」 「これは文章です」

答え3

@glennjackmanが指摘したように、これはすべてbashのマニュアルでカバーされています。マニュアルページで検索してくださいHISTORY EXPANSION

  • !#イベントインジケータ「これまで入力したコマンドライン全体」を意味します。あなたの例では、echo "This is a sentence. "最後の二重引用符の後に末尾のスペースを含めてください。

  • :分離イベントインジケータ!#)から単語インジケーター*)。

  • *単語インジケーター「ゼロ番目の単語を除くイベントのすべての単語」を意味します。

だからecho "This is a sentence. " !#:*拡張

echo "This is a sentence. " "This is a sentence. " $

(ドル記号は末尾のスペースを表す私のものです。)これは次のようになります。

This is a sentence.  This is a sentence. $

ターミナルとして(再び、ドル記号は空白の終わりを表す私のものです)。

第二イベントインジケータ:単語インジケーターpair(!#:1-)は同様の方法で動作します(ただし、最初のインジケータペアが評価された後にコマンドラインが大幅に拡張されたことを処理する必要があることに注意してください)。

答え4

私は試し!#:*てみました!#:1。オンラインで多くのリソースを見つけることはできませんが、1つを紹介してecho "Sample text"から!#:* !#:1 !#:2->text、!#:*を使用して文字列の内容を一時的に保存できると確信しています。あまりにも多くのリソースが見つからなかったため、これが条件文であるかどうかはわかりませんが、同じ内容を作成しようとしてキーストロークを保存しようとすると便利です。私はこれをBashで試しました。

echo "test" !#:* !#:1 !#:2 !#:3 !#:4->test1

test1で得られた結果は次のとおりです。

test test test test test test

とても素敵なツールです。

関連情報