Сьогодні мене спіймали червоношкірі під час спроби кодування гольфу генератора паролів для Twitter.
import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))
90 символів. Оскільки це багато вільного місця, я вирішив підняти планку і зробити її також виконуваною.
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 символів. Приємно, за винятком очевидно, що задихається на знак оклику.
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
Песичний знак оклику. "Давайте втечемо від цього", подумав я! Зрештою, у мене є один запасний персонаж.
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
Очевидно ...
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))
Залишаючи свій код асінінового гольфу вбік - я не можу цього пояснити.
З \!
, знак оклику уникнув, за винятком того, що насправді цього не було, тому що \!
залишено так, як echo
треба, щоб забрати.
Одне рішення могло використовуватись \x21
натомість, але я не переконаний, що це правильний спосіб уникнути знака оклику в команді bash.
tl; dr: Як правильно уникнути знака оклику в команді bash?
!:0
!$
І !^
заощаджую стільки часу і набираючи текст.
!event
в першу чергу використовує синтаксис? Це завжди заподіювало мені лише неприємності.