パスワードが必要なコマンドラインがあります。パスワードは「!1」文字で始まります。たとえば、「!1x9y377s」です。対応するパスワードでコマンドを実行すると、履歴拡張が発生し、最初の2文字「!1」が最初の履歴エントリに置き換えられます。例えば
ll
...list entries
echo !1x9y377s
llx9y377s
しかし、私が望むものは:
ll
...list entries
echo !1x9y377s
!1x9y377s
研究
私はこれがbashの解析前に発生した歴史的な拡張であることをすぐに実現しました。検索内容:コマンドラインに渡されたパスワードの履歴拡張を防ぐ方法は?結果は次のとおりです。
- 根
- 書く
- Berkeley tcsh ドキュメント "'!' は特別な意味を避けるために前に '\' を付けることができます。"
私は以下を実行しようとしています:
ll
...list entries
echo '!1x9y377s'
!1x9y377s
そして
ll
...list entries
echo \!1x9y377s
!1x9y377s
どちらも有効です。
答え1
この問題を解決する方法は2つあります。 ~によるとバークレー文書:「Theは特別な意味を避けるために!
前にaが来ることができます。」\
ただし、エスケープしたくない場合は、パスワードの周りに一重引用符を使用してください。例えば
ll
...list entries
echo '!1x9y377s'
!1x9y377s
Bashのマニュアルによると: 3.1.2.2一重引用符
文字を一重引用符( ')で囲むと、引用符内の各文字のリテラル値が保持されます。前にバックスラッシュがある場合でも、一重引用符の間に一重引用符を使用することはできません。