Hoje, fui flagrado ao tentar codificar um gerador de senhas para o Twitter no Twitter.
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))
90 caracteres. Como isso é muito espaço livre, decidi aumentar a barra e torná-la executável também.
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 caracteres. Bom, exceto que obviamente a pancada sufoca o ponto de exclamação.
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
Ponto de exclamação rouco. "Vamos escapar", pensei! Eu tenho um caractere reserva, afinal.
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
Obviamente ...
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))
Deixando meu asinino código de golfe de lado - não posso explicar isso.
Com \!
, o ponto de exclamação foi escapado, exceto que realmente não foi, porque o \!
foi deixado como está para echo
para pegar.
Uma solução poderia estar usando \x21
, mas não estou convencido de que essa seja a maneira correta de escapar de um ponto de exclamação em um comando bash.
tl; dr: Como você escapa de um ponto de exclamação em um comando bash?