Bashで感嘆符を正しくエスケープする方法は?

Bashで感嘆符を正しくエスケープする方法は?

今日、私はTwitterのパスワードジェネレータのゴルフコードを書こうとしました。

import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

90文字。空き容量が多く、基準を上げて実行可能にすることにしました。

echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

139文字。 bashが明らかに感嘆符のせいで窒息していることを除けば大丈夫です。

badp@delta:~$ echo -e "#!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
bash: !/usr/bin/python\nimport: event not found

迷惑な感嘆符。 「逃げよう」と思いました!結局、バックアップキャラクターができました。

echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg

確かに…

badp@delta:~$ echo -e "#\!/usr/bin/python\nimport string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))">pg;chmod +x pg;./pg
./pg: line 2: syntax error near unexpected token `('
./pg: line 2: `import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))'
badp@delta:~$ cat pg
#\!/usr/bin/python
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

私の愚かなゴルフコードはさておき-私はこれを説明できない。

を使用すると\!感嘆符がエスケープされますが、ピックアップの\!ために残りますので、実際にはそうではありませんecho

1つの解決策は代わりに使用することですが、\x21これはbashコマンドで感嘆符をエスケープする正しい方法だとは思わない。

簡単に言うと:bashコマンドで感嘆符を正しくエスケープする方法は?

ベストアンサー1

一重引用符を使用してください。

echo -e '#!/usr/bin/python\nimport string as s,random;print "".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

後で、ルールは!別の引用規則(cshから)に移植されました。シェルにコマンドライン編集機能がない場合に便利ですが、一部の人はまだそれを使用しています。

PS:bashをコーディングしているので:

echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

これはほとんどのuniceで動作します。

echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg

(なぜスクリプトを書くのか、スクリプト名がなぜ2文字であるのかわかりません。)

おすすめ記事