歴史的な拡張を引用すべきですか?

歴史的な拡張を引用すべきですか?

(引用符なしで)来ました!$。私は以前これを見たことがなく、いくつかのテストを行いました。

$ ls -l
(...some output...)
$ echo !$
-l
$ echo "!$"
-l

man bash履歴拡張セクションには次のように記載されています。

$最後の言葉。これは通常最後の引数ですが、行に単語が1つしかない場合は0番目の単語に展開されます。

それはできません。ところで、引用すべきでしょうか、引用しないでください。履歴拡張の別のテストの結果、次のような疑問が生じました。

$ man bash
$ "!!"
"man bash"
bash: man bash: command not found

これは予想されます。しかし、それではどうですか!$?言葉だから引用しなければならないようですが…

(ここでこの新しいタブを見てみましょう。.)

ベストアンサー1

履歴拡張では、単語の周りに引用符のセットを追加するかどうかによって異なります。

仮説foo="abc def"、比較

$ echo $foo
$ printf "<%s>\n" !$

そして

$ echo $foo
$ printf "<%s>\n" "!$"

前者は、を生成しprintf "<%s>\n" $foo、単語分割を呼び出し、printfフォーマット文字列の後に2つのパラメータを取得します。 2番目のものが生成されます。printf "<%s>\n" "$foo"ここで、引用符は通常どおり単語の分離を防ぎます。

もちろん、これを行うには:

$ echo "$foo"

次に、次のコマンドのaが!$展開され、"$foo"引用符が付きます。これで、引用符が効果的に互いに相殺される位置が"!$"作成されます。""!$""

おすすめ記事