Allgemeiner Tipp: Wenn Sie zwei Verschachtelungsebenen haben, vermeiden Sie die Verwendung von einfachen Anführungszeichen im inneren Befehl und einfache Anführungszeichen um den äußeren Befehl.
Weiterer Tipp: nicht verwendet Backticks - `…`
- Code auszuführen, verwenden Sie stattdessen $(…)
um ihn herum. Dollar-Klammern sind so ziemlich DWIM ('Mach was ich meine'), wenn es um verschachtelte Anführungszeichen geht. Backquotes haben arkane, Shell-abhängige Regeln.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
Wenn Sie einfache Anführungszeichen in einem Befehl in einfachen Anführungszeichen benötigen, können Sie verwenden '\''
. Stellen Sie sich diese vier Zeichen als die Möglichkeit vor, ein einfaches Anführungszeichen in einfache Anführungszeichen zu setzen. Technisch gesehen ist dies jedoch so aufgebaut, dass die Zeichenfolge in einfachen Anführungszeichen beendet, ein wörtliches einfaches Anführungszeichen angehängt und eine neue Zeichenfolge in einfachen Anführungszeichen (die immer noch an das angehängt wird) angehängt wird aktuelles Wort).
In komplexeren Fällen zählen Sie entweder die Anführungszeichen sorgfältig oder definieren Sie temporäre Variablen.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
Diese Antwort ist nicht spezifisch für zsh. Zsh bringt hier nichts Wichtiges. Sie können ein wenig Anführungszeichen sparen, da bei Befehlsersetzungen keine doppelten Anführungszeichen erforderlich sind. Manchmal gibt es Möglichkeiten, integrierte Funktionen anstelle externer Befehle zu verwenden, um den Anführungszeichenbedarf zu verringern. Die zugrunde liegenden Probleme sind jedoch dieselben wie in anderen Shells.
Oh, und übrigens, beachten Sie, watch
dass Ihr Befehl in ausgeführt wird sh
, nicht in zsh. Wenn Sie den Befehl in zsh ausführen möchten, müssen Sie ihn ausführen
watch -n 3 -x zsh -c "$cmd"
auf Debian / Ubuntu und
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(noch mehr zitieren!) woanders.
watch
kommt nicht mit den-x
noch-c
Optionen auf meinem Computer. Ich habe es online nachgeschlagen und keine Manpages gefunden, auf denen sie erwähnt werden. Was machen diese Optionen?-x
weistwatch
an, den Befehl nicht über eine Shell zu übergeben. Ich habe gerade herausgefunden, dass dies spezifisch für Debian / Ubuntu ist, obwohl es nicht als solches angegeben ist. Das-c
wird anzsh
nicht weitergegebenwatch
.-x
und-exec
Optionen existieren beide in meinemwatch
(auf Gentoo), also ist dies definitiv nicht Debian-spezifisch. Vielleicht hast du mit einer anderen Version von verglichenwatch
? Meins kommt aus dem Procps- Paket.watch
kommt auch vonprocps
Debian. Die offizielle Quelle hat nicht--exec
. Das Paket in Debian (und Derivaten einschließlich Ubuntu) fügt die Option in einem Debian-spezifischen Patch hinzu (watch_exec_beep.patch
es ist "Mortys Watch Exec Patch" aus Fehler # 410967 ). Gentoo hat möglicherweise einen ähnlichen Patch übernommen.