Heute wurde ich beim Versuch, einen Passwortgenerator für Twitter zu codieren, auf frischer Tat ertappt.
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))
90 Zeichen. Da dies viel Platz ist, habe ich beschlossen, die Messlatte höher zu legen und sie auch ausführbar zu machen.
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 Zeichen. Schön, außer offensichtlich Bash Chokes am Ausrufezeichen.
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
Lästiges Ausrufezeichen. "Lass uns entkommen", dachte ich! Ich habe doch einen freien Charakter.
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
Offensichtlich...
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))
Lassen Sie meinen Asinine-Code beim Golfen beiseite - das kann ich nicht erklären.
Mit \!wurde das Ausrufezeichen maskiert, außer es war wirklich nicht so, weil das \!so gelassen wurde, wie es ist echo, um es aufzunehmen.
Eine Lösung hätte \x21stattdessen verwendet werden können, aber ich bin nicht davon überzeugt, dass dies der richtige Weg ist, um einem Ausrufezeichen in einem Bash-Befehl zu entkommen.
tl; dr: Wie entgeht man einem Ausrufezeichen in einem Bash-Befehl richtig?
!eventSyntax in erster Linie? Es hat mir immer nur Ärger gemacht.