bashで感嘆符を適切にエスケープする方法は?


11

今日、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

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

明らかに...

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ピックアップします。

\x21代わりに1つの解決策を使用することもできますが、それがbashコマンドで感嘆符をエスケープする適切な方法であるとは思いません。

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


誰も!event最初に構文を実際に使用しますか?いつも悩みの種です。
badp '18

回答:


7

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

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


について知りませんでした$''。:) PS:それは、それらの予備のキャラクターを使い果たすことでした。140文字より短いツイートを投稿すると無駄に感じる。
badp

@badp:覚えやすいパスワードを生成するようにしてください。(pwgen対のようにpwgen -s。)
Gilles「SO-邪悪なことをやめなさい」

覚えやすいが意味のないパスフレーズにはdadadodoを使用することもできます:)
badp

1

質問する前にググってみたら良かった。

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

クラクションでの回答私は感嘆符をエスケープするにはどうすればよいですか?


1
ただし、この特定のケースのみに回答するため、この回答を承認済みとしてマークしていません。一般的に、拡張なしでは逃げられません。
badp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.