GNU/Linux >> Belajar Linux >  >> Linux

Membungkus Perintah Yang Termasuk Kutipan Tunggal Dan Ganda Untuk Perintah Lain?

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?
Linux
  1. Bagaimana cara mengganti tanda kutip tunggal dengan karakter lain di sed?

  2. Apa itu double dot(..) dan single dot(.) di Linux?

  3. grep untuk istilah dan mengecualikan istilah lain

  1. 10 tutorial perintah Linux untuk pemula dan ahli

  2. Apa yang Mendefinisikan Ukuran Maksimum Untuk Argumen Perintah Tunggal?

  3. Buka halaman manual dan cari string dalam satu perintah

  1. Mengupas tanda kutip tunggal dan ganda dalam sebuah string hanya menggunakan perintah bash / standar Linux

  2. Cara membuat direktori dan memberikan izin dalam satu perintah

  3. perintah bash alias dengan tanda kutip tunggal dan ganda