Hoy, me sorprendieron con las manos en la masa mientras intentaba codificar un generador de contraseñas para Twitter.
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))
90 caracteres Como eso es mucho espacio libre, decidí subir el listón y hacerlo ejecutable también.
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. Agradable, excepto que obviamente se atraganta con el signo de exclamación.
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
Signo de exclamación molesto. "Vamos a escapar", pensé! Tengo un personaje extra después de todo.
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))
Dejando a un lado mi código tonto jugando al golf, no puedo explicar esto.
Con \!
, el signo de exclamación se escapó, excepto que realmente no lo fue, porque \!
se dejó como está para echo
que lo recoja.
Una solución podría haber estado usando en su \x21
lugar, pero no estoy convencido de que sea la forma correcta de escapar de un signo de exclamación en un comando bash.
tl; dr: ¿Cómo escapas correctamente de un signo de exclamación en un comando bash?
!:0
!$
y !^
ahorro mucho tiempo y escribiendo.
!event
sintaxis en primer lugar? Siempre me ha causado solo problemas.