Сегодня меня поймали с поличным, когда я пытался закодировать в гольф генератор паролей для 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 символов Хорошо, за исключением, очевидно, удушения bash на восклицательный знак.
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))
Оставляя в стороне мой гольф-код asinine - я не могу этого объяснить.
При \!
этом восклицательный знак был исключен, за исключением того, что на самом деле это не так, потому что \!
он оставлен как есть, echo
чтобы забрать.
\x21
Вместо этого можно было бы использовать одно решение , но я не уверен, что это правильный способ избежать восклицательного знака в команде bash.
tl; dr: Как правильно избежать восклицательного знака в команде bash?
!:0
!$
и !^
экономлю так много времени и печатать.
!event
синтаксис в первую очередь? Это всегда доставляло мне только неприятности.