Baru-baru ini saya mempelajari tentang jam tangan, tetapi saya mengalami kesulitan untuk membuatnya bekerja dengan perintah yang relatif canggih.
Misalnya, saya ingin menanyakan watch
untuk menjalankan perintah berikut pada zsh
setiap tiga detik:
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
seperti yang Anda lihat baris di atas termasuk tanda kutip tunggal, tanda kutip ganda, di antara karakter khusus lainnya.
Jadi saya mencoba:
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
tapi kemudian saya mendapatkan:
tidak ditemukan kecocokan untuk x di [email protected]#$# ….; selesai
Saya mencoba kombinasi lain tanpa hasil. Inilah salah satu upaya tersebut:
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
yang juga menghasilkan kesalahan serupa.
Ada ide bagaimana cara membuatnya bekerja?
Saya juga akan tertarik dengan solusi yang bekerja pada bash
Jawaban yang Diterima:
Kiat umum:jika Anda memiliki dua tingkat penyarangan, hindari penggunaan tanda kutip tunggal di perintah dalam, dan gunakan tanda kutip tunggal di sekitar perintah luar.
Tips tambahan:jangan gunakan backtick – `…`
– untuk mengeksekusi kode, gunakan $(…)
di sekitarnya. Tanda kurung dolar cukup banyak DWIM('Lakukan apa yang saya maksud') dalam hal kutipan bersarang; backquote memiliki aturan misterius yang bergantung pada shell.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
Jika Anda membutuhkan tanda kutip tunggal di dalam perintah tanda kutip tunggal, Anda dapat menggunakan '''
. Pikirkan keempat karakter ini sebagai cara untuk mengutip satu kutipan di dalam tanda kutip tunggal, meskipun secara teknis ini dibangun sebagai akhir dari string yang dikutip tunggal, menambahkan kutipan tunggal literal, dan memulai string baru yang dikutip tunggal (masih ditambahkan ke kata saat ini).
Untuk kasus yang lebih kompleks, hitung tanda kutip dengan susah payah, atau tentukan variabel sementara.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
Jawaban ini tidak spesifik untuk zsh. Zsh tidak membawa sesuatu yang besar di sini. Anda dapat menghemat sedikit kutipan karena tidak perlu tanda kutip ganda di sekitar substitusi perintah, dan terkadang ada cara untuk menggunakan perintah bawaan daripada perintah eksternal yang mengurangi kebutuhan kutipan, tetapi masalah dasarnya sama seperti di shell lain.
Oh, ngomong-ngomong, perhatikan bahwa watch
akan menjalankan perintah Anda di sh
, bukan di zsh. Jika Anda ingin menjalankan perintah di zsh, Anda harus menjalankan
watch -n 3 -x zsh -c "$cmd"
di Debian/Ubuntu, dan
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(bahkan lebih banyak kutipan!) di tempat lain.
Terkait:Melampirkan vs. tidak melampirkan nilai variabel dalam tanda kutip di bash?