Сегодня меня поймали с поличным, когда я пытался закодировать в гольф генератор паролей для 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?
!event
синтаксис в первую очередь? Это всегда доставляло мне только неприятности.!:0
!$
и!^
экономлю так много времени и печатать.Ответы:
Используйте одинарные кавычки:
Правила
!
были как бы привиты к другим правилам цитирования позже (из csh). Они были очень полезны, когда в оболочках не было редактирования командной строки, но некоторые люди до сих пор используют их.PS Так как вы пишете код для bash:
Это работает на большинстве единиц:
(Не то, чтобы я понял, почему вы хотите создать скрипт или почему имя скрипта должно состоять из двух букв.)
источник
$''
. :) PS: это было попытка использовать этих запасных персонажей. У меня возникает чувство траты, когда я публикую твиты короче 140 символов.pwgen
противpwgen -s
.)Я должен был погуглить, прежде чем я спросил.
источник