Bashコマンドラインから呼び出されたスクリプトに渡された文字列引数に "!"を含める方法

Bashコマンドラインから呼び出されたスクリプトに渡された文字列引数に "!"を含める方法

ユーザーが2つの句読点を誤って入力したときにPython TTSプログラムがどのように反応するかをテストする必要があります。

だから「C'est un test!」という文章を確認しなければなりません。 (知っている! 。最後に)。

だから、メッセージが表示されたら入力しました。

  $ python3 /home/user1/TTS/bin/synthesize.py --text "C'est un test!."

しかし、Bashは次のように表示します。

python3 /home/user1/TTS/bin/synthesize.py --text "これはテストです。/設定"

(「!.」が「./configure」にどのように変更されるかを確認してください)。

「This is a test!」(ピリオドを除く)は機能しますが、「!.」をテストする必要があります。

二重引用符を一重引用符に置き換えようとしましたが、成功しませんでした。 「!」を「」としてエスケープしましたが、TTSライブラリに転送された文に含まれています。

私は「!」がBashで特別な意味を持つことを理解しています。ここ)と「。」に関連付けられています。前のコマンドを使用します。

Bashが文字列で "!."を処理しないようにし、そのまま渡す方法はありますか?

ご協力ありがとうございます

答え1

これは歴史的拡張。空の文字列を使用または設定しset +Hset +o histexpand完全に無効にすることができます$histchars。あるいは、ここで二重引用符の代わりに一重引用符を使用することもできます。引用符に加えてプレフィックスを追加して!履歴拡張を無効にすることもできます\

バッシュによるとset --help

-oオプション名は、
オプション名に対応する変数を設定します。
[...]
-H
[...]
-Hを使用してhistexpandを
有効にします!スタイル履歴の代替。このフラグは、シェルが対話型のときにデフォルトでオンになっています。
[...]
- 代わりに+を使用すると、これらのフラグはオフになります。

次のコマンドを実行して違いを確認できます。

set -H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

set +H
$> echo "hello!."
$> echo "hello!1"
$> !2
$> !3

関連情報