Bash'daki ünlem noktalarından düzgün bir şekilde kaçmak için


11

Bugün, Twitter için bir şifre üreticisi golf kodlamaya çalışırken redhanded yakalandı.

import string as s,random;print ''.join(random.sample(s.letters+s.digits+s.punctuation,9))

90 karakter. Çok fazla boş alan olduğu için çıtayı yükseltmeye ve çalıştırılabilir hale getirmeye karar verdim.

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 karakter. Güzel, belli ki bash boğaz ünlem işareti hariç.

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 ünlem işareti. "Hadi kaçalım," diye düşündüm! Sonuçta bir yedek karakterim var.

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

Açıkçası ...

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 kodumu bir kenara bırakıyorum - bunu açıklayamam.

İle \!ünlem işareti kaçtı, ancak gerçekten değildi, çünkü almak için \!olduğu gibi bırakıldı echo.

Bunun \x21yerine bir çözüm kullanıyor olabilirdi , ama bunun bir bash komutunda bir ünlem noktasından kaçmanın doğru yolu olduğuna ikna olmadım.

tl; dr: Bir bash komutundaki ünlem işaretinden nasıl düzgün çıkıyorsunuz?


Aslında!event sözdizimini ilk etapta kullanan var mı ? Her zaman bana sadece bela verdi.
badp

Neredeyse her gün kullanıyorum (son 20 yılın çoğu için) !:0 !$ve !^çok zaman ve yazım tasarrufu yapıyorum .
Alexx Roche

Yanıtlar:


7

Tek tırnak kullanın:

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

Kuralları için !(csh'ın gelen) daha sonra diğer alıntı kuralları üzerine aşılanmış tür edildi. Kabukların komut satırı düzenlemesi olmadığı zaman çok yararlıydılar, ancak bazı insanlar şimdi onları hala kullanıyor.

PS: Bash için kodlama yaptığınızdan:

echo $'#!/usr/bin/python\nimport string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'>pg;chmod +x pg;./pg

Bu, birçok unice üzerinde çalışır:

echo python -c \''import string as s,random;print"".join(random.sample(s.letters+s.digits+s.punctuation,9))'\'>pg;chmod +x pg;./pg

(Neden bir komut dosyası oluşturmak istediğinizi veya komut dosyası adının neden iki harf olması gerektiğini anladığımdan değil.)


Bilmiyordum $''. :) Not: Bu yedek karakterleri denemek ve kullanmaktı. 140 karakterden daha kısa tweet'ler gönderdiğimde israfım var.
badp

@badp: Unutulmaz parolalar oluşturmaya çalışın . (Olduğu gibi pwgenvs. pwgen -s).
Gilles 'SO dur olma kötülük'

O zaman unutulmaz ama saçma parolalar için dadadodo kullanabilirsiniz :)
badp

1

Sormadan önce Google'ı aramalıydım.

Değişkenleri genişletmek için bash'a bağımlı olmadığınız için [..] bunun yerine tek tırnak kullanabilirsiniz. Tek tırnak içindeki dizeler bash tarafından genişletilmez.

korna içinde cevap için ben bir ünlem işareti kaçış nasıl?


1
Bu yanıtı kabul edilmiş olarak işaretlemiyorum, çünkü sadece bu özel duruma cevap veriyor. Genellikle genişleme olmadan kaçamazsınız.
badp
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.