it-swarm-ja.tech

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チョークを除いて、素晴らしい。

_[email protected]:~$ 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
_

厄介な感嘆符。 「逃げよう」と思った!結局、予備のキャラクターが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
_

明らかに...

_[email protected]:~$ 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))'
[email protected]:~$ 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コマンドで感嘆符をエスケープする適切な方法であるとは確信していません。

tl; dr:bashコマンドで感嘆符を適切にエスケープするにはどうすればよいですか?

11
badp

一重引用符を使用します。

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から)他の引用ルールに移植されました。シェルにコマンドライン編集がなかったときは非常に便利でしたが、今でも使用している人もいます。

P.S. 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

これはほとんどのユニスで機能します。

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文字にする必要があるのか​​理解できません。)

私は尋ねる前にググってみるべきだった。

変数を展開するためにbashに依存しないため[..]代わりに単一引用符を使用できます。一重引用符で囲まれた文字列は、bashでは展開されません。

honk in reply to 感嘆符をエスケープするにはどうすればよいですか?

1
badp