Başka bir komut için tek ve çift tırnak içeren bir komutu kaydırma


10

Son zamanlarda seyretmeyi öğrendim , ancak nispeten karmaşık komutlarla çalışmasını sağlamakta sorun yaşıyorum.

Örneğin, her üç saniyede bir *watch aşağıdaki komutu çalıştırmak istiyorum * :zsh

for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done

Yukarıdaki satırda gördüğünüz gibi, diğer özel karakterlerin yanı sıra tek tırnak, çift tırnak içerir.

Bu yüzden denedim:

watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"

ama sonra:

içinde hiçbir eşleşme bulunamadı! @ # $ # ....; tamam

Başka kombinasyonları da denemeden denedim. İşte bu girişimlerden biri:

watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"

bu da benzer bir hatayla sonuçlanır.

Bu işin nasıl yapılacağı hakkında bir fikrin var mı?


* Ayrıca üzerinde çalışan çözümlere de müdahale edeceğimbash

Yanıtlar:


16

Genel ipucu: İki düzey iç içe yerleştirme varsa, iç komutta tek tırnak kullanmaktan kaçının ve dış komutun çevresinde tek tırnak kullanın.

Ek ipucu: `…` kodu yürütmek için ters tırnak kullanmayın - - bunun yerine kullanın $(…). İç içe tırnak söz konusu olduğunda, dolar-parantez hemen hemen DWIM ('Ne demek istediğimi yap'); backquotes, gizli, kabuk bağımlı kurallara sahiptir.

watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'

Tek tırnaklı bir komutun içinde tek tırnaklara ihtiyacınız varsa kullanabilirsiniz '\''. Bu dört karakteri tek tırnak içinde tek bir fiyat teklifi vermenin bir yolu olarak düşünün, ancak teknik olarak konuşursak bu tek tırnaklı dizgenin sonu olarak inşa edilir, gerçek bir tek tırnak eklenir ve yeni bir tek tırnaklı dize (yine de geçerli kelime).

Daha karmaşık durumlar için, ya alıntıları dikkatlice sayın ya da geçici değişkenler tanımlayın.

cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'

Bu cevap zsh'a özgü değil. Zsh buraya önemli bir şey getirmiyor. Komut ikameleri etrafında çift tırnak kullanmaya gerek olmadığından biraz alıntı kaydedebilirsiniz ve bazen alıntı gereksinimlerini azaltan harici komutlar yerine yerleşik komutları kullanmanın yolları vardır, ancak altta yatan sorunlar diğer kabuklardakiyle aynıdır.

Oh, ve bu arada, watchkomutunuzu shzsh içinde değil , yerine getireceğini unutmayın . Komutu zsh biçiminde yürütmek istiyorsanız, çalıştırmanız gerekir

watch -n 3 -x zsh -c "$cmd"

Debian / Ubuntu ve

export cmd
watch -n 3 'exec zsh -c "$cmd"'

(daha da alıntı!).


Teşekkürler @Gilles. Bu çok yardımcı oldu. İlginçtir watch, makinemde -xne -cseçeneklerle gelmiyor . Çevrimiçi baktım ve onlardan bahseden adam sayfaları bulamadım. Bu seçenekler ne işe yarar?
Amelio Vazquez-Reina

1
@intrpc komutu bir kabuktan geçirmemeyi -xsöyler watch. Bu şekilde belirtilmemiş olsa bile, bunun Debian / Ubuntu'ya özgü olduğunu öğrendim. -cGeçirilir zshdeğil, watch.
Gilles 'SO- kötü olmayı kes

@Gilles -xve -execseçenekler hem mevcut benim watch, bu yüzden bu kesinlikle Debian özgü değildir (gentoo üzerine). Belki başka bir sürümü ile karşılaştırdın watch? Benimki procps paketinden geliyor .
rozcietrzewiacz

1
@rozcietrzewiacz Debian'dan da watchgeliyor procps. Resmi kaynak yok --exec. Debian'daki paket (ve Ubuntu dahil türevleri), Debian'a özgü bir watch_exec_beep.patchyamada seçenek ekler ( ; hata # 410967'den “Mortys watch exec yaması” ). Gentoo benzer bir yama benimsemiş olabilir.
Gilles 'SO- kötü olmayı bırak'
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.