Wskazówka ogólna: jeśli masz dwa poziomy zagnieżdżania, unikaj używania pojedynczych cudzysłowów w poleceniu wewnętrznym i używaj pojedynczych cudzysłowów wokół polecenia zewnętrznego.
Dodatkowa wskazówka: nie używaj odwrotnych znaków - `…`
- do wykonania kodu, zamiast tego używaj $(…)
go wokół niego. Nawiasy w dolarach są w zasadzie DWIM („Zrób to, co mam na myśli”), jeśli chodzi o zagnieżdżone cudzysłowy; cudzysłowy mają tajemne, zależne od powłoki reguły.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
Jeśli potrzebujesz pojedynczych cudzysłowów w poleceniu pojedynczego cudzysłowu, możesz użyć '\''
. Pomyśl o tych czterech znakach jako sposobie cytowania pojedynczego cytatu w pojedynczych cudzysłowach, chociaż technicznie rzecz biorąc, jest on skonstruowany jako zakończenie łańcucha pojedynczego cudzysłowu, dołącz dosłowny pojedynczy cudzysłów i rozpocznij nowy ciąg pojedynczego cudzysłowu (nadal dołączany do aktualne słowo).
W przypadku bardziej skomplikowanych przypadków należy skrupulatnie policzyć cudzysłowy lub zdefiniować zmienne tymczasowe.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
Ta odpowiedź nie jest specyficzna dla zsh. Zsh nie przynosi tu nic ważnego. Możesz zaoszczędzić trochę na cytowaniu, ponieważ nie ma potrzeby podwójnego cudzysłowu wokół podstawiania poleceń, a czasami istnieją sposoby użycia wbudowanych zamiast zewnętrznych poleceń, które zmniejszają potrzeby cytowania, ale podstawowe problemy są takie same jak w innych powłokach.
Aha, nawiasem mówiąc, zauważ, że watch
wykona twoje polecenie w sh
, a nie w Zsh. Jeśli chcesz wykonać polecenie w zsh, musisz uruchomić
watch -n 3 -x zsh -c "$cmd"
na Debian / Ubuntu i
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(jeszcze więcej cytatów!) w innym miejscu.
watch
nie ma opcji-x
nor-c
na moim komputerze. Sprawdziłem to online i nie znalazłem żadnych stron podręcznika, które by je wspominały. Co robią te opcje?-x
mówi,watch
aby nie przekazywać polecenia przez powłokę. Właśnie dowiedziałem się, że jest to specyficzne dla Debian / Ubuntu, nawet jeśli nie jest to oznaczone jako takie.-c
Jest przekazywanyzsh
, niewatch
.-x
i-exec
istnieją w moimwatch
(na Gentoo), więc zdecydowanie nie jest to specyficzne dla Debiana. Może porównałeś się z inną wersjąwatch
? Mój pochodzi z pakietu procps .watch
pochodzi zprocps
Debiana. Oficjalne źródło nie ma--exec
. Pakiet w Debianie (i jego pochodnych, w tym Ubuntu) dodaje opcję wwatch_exec_beep.patch
łatce specyficznej dla Debiana ( ; jest to „łatka wykonawcza Mortysa oglądająca” z błędu # 410967 ). Gentoo mogło przyjąć podobną łatkę.