私は通常感嘆echo
符付きの特定の文字列が好きです。でも知るシェルの拡張を防ぐためにエスケープする方法を見つけました。返品バックスラッシュ印刷...
echo "\!" # will print \! instead of just !
他のツールと反対sed
他のツールと反対確かに有効な引数の拡張を防ぐために使用される場合は、sed
バックスラッシュを印刷します。
echo "test" | sed 's/^\(.*\)$/\1 \!/' # print -> test !
echo "test" | sed 's/^\(.*\)$/\1 !/' # also print -> test !
echo "test" | sed "s/^\(.*\)$/\1 ! /" # also print -> test !, though needed to put a space or use a backslash for it to show correctly
同じことをどのように実行できますか?echo
それとも、他のツールを使用する必要がありますかsed
?
編集する:
''
上記の""
例の代わりに使用すると、シェル拡張なしで(バックスラッシュの有無にかかわらず)印刷されecho
ます。!
- 人々がコマンドオーバーライドを使用しようとすると、
echo
以下でのみ機能するため、機能しません""
。
答え1
あなたはそれを逃げなければなりません。または引用してください。両方ではありません。
echo \!
echo "!"
Bashレコード拡張は、エスケープされた感嘆符、一重引用符で囲まれた感嘆符、閉じる二重引用符の前に表示される感嘆符を無視します。バラよりマニュアルの歴史的インタラクティブセクションもっと学ぶ。だから
echo '!'
また、動作し、感嘆符がどこにあるか考える必要はありません。
printf
置換を使用して、単一引用符を変数拡張と組み合わせることができますecho
。同じコマンドラインで複数の形式の引用を組み合わせることもできます。
echo '!'"$(echo test)"
しかし一般的に、printf
比較するecho
。他の人が述べたように、履歴拡張を完全に無効にすることもできます。非対話型シェルはデフォルトでは有効になっていません。