J'ai récemment découvert la montre, mais j'ai du mal à la faire fonctionner avec des commandes relativement sophistiquées.
Par exemple, je voudrais demander watch
pour exécuter la commande suivante sur zsh
toutes les trois secondes :
for x in `command_1 | grep keyword | cut -d' ' -f1`; do command_2 "word[word=number]" $x; done
comme vous pouvez le voir, la ligne ci-dessus comprend des guillemets simples, des guillemets doubles, entre autres caractères spéciaux.
Alors j'ai essayé :
watch -n 3 "for x in `my_command | grep keyword | cut -d' ' -f1`; do command2 "rusage[mem=7000]" $x; done"
mais ensuite j'ai eu :
aucune correspondance trouvée pour x dans [email protected]#$# …. ; terminé
J'ai essayé d'autres combinaisons sans succès. Voici l'une de ces tentatives :
watch -n 3 "for x in $(bjobs -w | grep pre_seg | cut -d' ' -f1); do bmod -R "rusage[mem=7000]" $x; done"
qui entraîne également une erreur similaire.
Des idées pour que cela fonctionne ?
Je serais également intéressé par des solutions qui fonctionnent sur bash
Réponse acceptée :
Conseil général :si vous avez deux niveaux d'imbrication, évitez d'utiliser des guillemets simples dans la commande interne et utilisez des guillemets simples autour de la commande externe.
Conseil supplémentaire :n'utilisez pas de backticks - `…`
– pour exécuter du code, utilisez plutôt $(…)
autour de. Dollar-parenthèses est à peu près DWIM ("Faites ce que je veux dire") en ce qui concerne les guillemets imbriqués ; les backquotes ont des règles obscures, dépendantes du shell.
watch -n 3 'for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
Si vous avez besoin de guillemets simples dans une commande à guillemets simples, vous pouvez utiliser '''
. Considérez ces quatre caractères comme le moyen de citer un guillemet simple à l'intérieur de guillemets simples, bien que techniquement parlant, cela soit construit comme terminer la chaîne entre guillemets simples, ajouter un guillemet simple littéral et commencer une nouvelle chaîne entre guillemets simples (toujours ajoutée au mot courant).
Pour les cas plus complexes, comptez minutieusement les guillemets ou définissez des variables temporaires.
cmd='for x in $(my_command | grep keyword | cut -d" " -f1); do command2 "rusage[mem=7000]" "$x"; done'
watch_cmd='watch -n 3 "$cmd"'
Cette réponse n'est pas spécifique à zsh. Zsh n'apporte rien de majeur ici. Vous pouvez économiser un peu de guillemets car il n'y a pas besoin de guillemets doubles autour des substitutions de commandes, et parfois il existe des moyens d'utiliser des commandes intégrées plutôt que des commandes externes qui réduisent les besoins de guillemets, mais les problèmes sous-jacents sont les mêmes que dans d'autres shells.
Oh, et au fait, notez que watch
exécutera votre commande en sh
, pas en zsh. Si vous souhaitez exécuter la commande dans zsh, vous devez exécuter
watch -n 3 -x zsh -c "$cmd"
sur Debian/Ubuntu, et
export cmd
watch -n 3 'exec zsh -c "$cmd"'
(encore plus de citations !) ailleurs.
Connexe:Enfermer ou ne pas enfermer la valeur d'une variable entre guillemets en bash?