Hoje, fui pego em flagrante enquanto tentava codificar no golfe um gerador de senhas para o 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 elevar a fasquia 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 o bash engasga com 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 traquina. "Vamos fugir", pensei! Eu tenho um personagem sobressalente, 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 código estúpido de lado - não posso explicar isso.
Com \!
, o ponto de exclamação foi escapado, exceto que realmente não era, porque o \!
foi deixado como é para echo
pegar.
Uma solução poderia estar sendo usada \x21
, mas não estou convencido de que seja a maneira correta de escapar de um ponto de exclamação em um comando bash.
tl; dr: Como você escapa corretamente um ponto de exclamação em um comando bash?
!event
sintaxe em primeiro lugar? Sempre me causou apenas problemas.