GNU/Linux >> Znalost Linux >  >> Linux

Zabalit příkaz, který obsahuje jednoduché a dvojité uvozovky pro jiný příkaz?

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?
Linux
  1. Jak vytvořit adresář a udělit oprávnění jedním příkazem

  2. příkaz bash alias s jednoduchými i dvojitými uvozovkami

  3. Kompilace a sestavení pomocí jediného příkazového řádku Java (Linux)

  1. Nastavení pipefail pro jeden pipetovaný příkaz

  2. Různé barvy pro příkaz a výstup

  3. Nahrazení podtržítka čárkou a odstranění dvojitých uvozovek v CSV

  1. 10 návodů na příkazy Linuxu pro začátečníky a experty

  2. Co definuje maximální velikost pro jeden příkazový argument?

  3. Jak zakázat alias v Bash pro jeden příkaz?