Nedávno jsem se dozvěděl o hodinkách, ale mám potíže s jejich zprovozněním s relativně sofistikovanými příkazy.
Například bych se chtěl zeptat watch
pro spuštění následujícího příkazu na zsh
každé tři sekundy:
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
jak můžete vidět, řádek výše obsahuje jednoduché uvozovky, dvojité uvozovky a další speciální znaky.
Tak jsem to zkusil:
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
ale pak jsem dostal:
nebyly nalezeny žádné shody pro x v [email protected]#$# ….; hotovo
Zkoušel jsem i jiné kombinace bez úspěchu. Zde je jeden z těchto pokusů:
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
což má také za následek podobnou chybu.
Nějaké nápady, jak to udělat, aby to fungovalo?
Také bych měl zájem o řešení, která fungují na bash
Přijatá odpověď:
Obecná rada:pokud máte dvě úrovně vnoření, vyhněte se používání jednoduchých uvozovek ve vnitřním příkazu a používejte jednoduché uvozovky kolem vnějšího příkazu.
Další tip:nepoužívejte zpětná označení – `…`
– pro spuštění kódu použijte místo toho $(…)
kolem toho. Pokud jde o vnořené uvozovky, závorky dolaru jsou do značné míry DWIM („Udělejte to, co mám na mysli“); zpětné uvozovky mají tajemná pravidla závislá na shellu.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
Pokud potřebujete jednoduché uvozovky uvnitř příkazu s jednoduchými uvozovkami, můžete použít '''
. Přemýšlejte o těchto čtyřech znacích jako o způsobu, jak citovat jedinou uvozovku uvnitř jednoduchých uvozovek, i když technicky vzato je to konstruováno tak, že ukončíte řetězec s jednou uvozovkou, přidáte doslovnou jednoduchou uvozovku a začnete nový řetězec s jednoduchou uvozovkou (stále připojený k aktuální slovo).
Ve složitějších případech buď pečlivě spočítejte uvozovky, nebo definujte dočasné proměnné.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
Tato odpověď není specifická pro zsh. Zsh zde nepřináší nic zásadního. Můžete si ušetřit trochu uvozovek, protože u náhrad příkazů nejsou potřeba dvojité uvozovky a někdy existují způsoby, jak použít vestavěné namísto externích příkazů, které snižují potřebu citací, ale základní problémy jsou stejné jako v jiných shellech.
Jo a mimochodem, všimněte si, že watch
provede váš příkaz v sh
, ne v zsh. Pokud chcete provést příkaz v zsh, musíte spustit
watch -n 3 -x zsh -c "$cmd"
na Debian/Ubuntu a
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(ještě více citací!) jinde.
Související:Uzavření vs neuzavření hodnoty proměnné do uvozovek v bash?