Dzisiaj zostałem przyłapany na gorącym uczynku podczas próby kodowania golfa jako generatora haseł na Twitterze.
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))
90 znaków. Ponieważ jest to dużo wolnego miejsca, postanowiłem podnieść poprzeczkę i uczynić ją również wykonalną.
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 znaków. Fajnie, z wyjątkiem oczywiście dławienia się wykrzyknikiem.
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
Pesky wykrzyknik. „Chodźmy stąd” - pomyślałem! W końcu mam jedną wolną postać.
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
Oczywiście...
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))
Odkładając na bok mój kod asinine golfa - nie potrafię tego wyjaśnić.
Z \!
wykrzyknikiem udało się uciec, ale tak naprawdę nie było, ponieważ \!
pozostawiono go echo
do odebrania.
\x21
Zamiast tego można było zastosować jedno rozwiązanie , ale nie jestem przekonany, że to właściwy sposób na uniknięcie wykrzyknika w poleceniu bash.
tl; dr: Jak właściwie uciec od wykrzyknika w poleceniu bash?
!:0
!$
i !^
oszczędzam tyle czasu i pisania.
!event
składni? Zawsze sprawiało mi to tylko kłopoty.