Bagaimana cara menghindari tanda seru di bash?


11

Hari ini, saya ketahuan saat mencoba kode golf generator kata sandi untuk Twitter.

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

90 karakter. Karena ada banyak ruang kosong, saya memutuskan untuk menaikkan standar dan membuatnya dapat dieksekusi juga.

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. Bagus, kecuali jelas bash tersedak titik seru.

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

Titik seru sial. "Ayo kita lepaskan," pikirku! Saya memang punya satu karakter cadangan.

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

Jelas ...

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))

Mengesampingkan kode asinine saya golf - saya tidak bisa menjelaskan ini.

Dengan \!, tanda seru itu lolos, kecuali sebenarnya tidak, karena \!dibiarkan apa adanya untuk echodijemput.

Satu solusi bisa saja menggunakan \x21, tapi saya tidak yakin itu cara yang tepat untuk lolos dari tanda seru di perintah bash.

tl; dr: Bagaimana Anda bisa lolos dari tanda seru dengan perintah bash?


Adakah yang benar-benar menggunakan !eventsintaksis? Itu selalu menyebabkan saya hanya kesulitan.
badp

Saya menggunakannya hampir setiap hari, (untuk sebagian besar dari 20 tahun terakhir.) !:0 !$Dan !^menghemat banyak waktu dan mengetik.
Alexx Roche

Jawaban:


7

Gunakan satu kutipan:

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

Aturan untuk !itu semacam dicangkokkan ke aturan mengutip lainnya sesudahnya (dari csh). Mereka sangat berguna saat shell tidak memiliki pengeditan baris perintah, tetapi beberapa orang masih menggunakannya sekarang.

PS Karena Anda mengkode untuk bash:

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

Ini berfungsi pada sebagian besar persatuan:

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

(Bukannya saya mengerti mengapa Anda ingin membuat skrip atau mengapa nama skrip harus dua huruf.)


Tidak tahu $''. :) PS: Itu untuk mencoba dan menggunakan karakter cadangan itu. Saya memiliki perasaan sia-sia ketika saya memposting tweet yang lebih pendek dari 140 karakter.
badp

@badp: Jadi cobalah membuatnya menghasilkan kata sandi yang mudah diingat . (Seperti dalam pwgenvs pwgen -s..)
Gilles 'SO- stop being evil'

Mungkin juga gunakan dadadodo untuk kata sandi yang mudah diingat tapi tidak masuk akal :)
badp

1

Seharusnya saya mencari Google sebelum bertanya.

Karena Anda tidak bergantung pada bash untuk memperluas variabel [..] Anda bisa menggunakan tanda kutip tunggal. String dalam tanda kutip tunggal tidak diperluas oleh bash.

membunyikan klakson sebagai balasan atas Bagaimana saya lolos dari tanda seru?


1
Saya tidak menandai jawaban ini sebagai diterima, karena hanya menjawab kasus khusus ini. Secara umum, Anda tidak dapat pergi tanpa ekspansi.
badp
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.