回答:
感嘆符は、bashの履歴展開の一部です。これを使用するには、単一引用符で囲む必要があります(例:)、'http://example.org/!132'
または\
文字の前にバックスラッシュ()を付けて直接エスケープする必要があります(例:)"http://example.org/\!132"
。
二重引用符では、エクスクラムの前のバックスラッシュが履歴の展開を妨げますが、そのような場合、バックスラッシュは削除されないことに注意してください。したがってcurl
、URLの一部としてリテラルのバックスラッシュを渡さないように、単一引用符を使用することをお勧めします。
"http://example.org/\!132"
バックスラッシュを解釈せずに実際に展開します(POSIX準拠の理由、私は信じています)。
\!
と二重引用符でした。
|
あり、パイプの作成に使用されます。スクリプトを顧客に送信していて、どのシェルで実行されるかわからない場合は、すべてをテストする必要があります!
ダニエルの答えに加えて、を使用しない場合は、単に履歴展開を完全にオフにすることもできますset +H
。
fc -14
使用してください。 しかし、履歴展開も有効にせずにそれを行うことができるのは事実です。個人的に、私が使用!$
して!vi
とsudo !!
しても、git add !vi:$
多くの場合、十分な履歴展開が有効になったまま保証します。
私は個人的に単一引用符を行うだろうが、完全を期すために、私はまた、それがURLであるため、あなたがエンコードすることができます注意!
として%21
例えば、curl -v http://example.org/%21132
。
これもできます
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
または
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
これは、bashが隣接する文字列を連結するために機能します。このアプローチは、シェルの展開を必要とする他のものがある場合に特に役立ちます。したがって、文字列全体に一重引用符を使用することはできません。
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
文字は、コマンドラインプロンプトでの履歴展開に使用されます。
そのため、これはプロンプトでは問題になりますが、シェルスクリプトファイルでは問題になりません。
履歴の展開は二重引用符でも機能することがわかります。
Bash 4.3以降、二重引用符を使用して履歴拡張文字を引用できるようになりました。
$ bash --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!
echo
、エコーは異なり、独自にこれを処理するようだ
bash
バージョンは、バンが展開されていないこととは関係ありません。これは、例で!
は「行末」が後に続き、シェルが展開しようとするのを防ぐためです。試してみてください 。返事echo "!Hello World"
が表示されます。詳細については、マニュアルを参照してくださいbash
bash: !Hello: event not found
Windowsでgit bashを使用している人には、@ DanielPittmanから受け入れられた答えが機能します。ただし、円記号(\)をスラッシュ(/)に置き換える必要があります。
たとえば、Unixでは、次のようになります。
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Windowsの場合、このようなものになります(認証ヘッダー部分のスラッシュに注目してください)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'