GNU/Linux >> Tutoriels Linux >  >> Linux

Envelopper une commande qui inclut des guillemets simples et doubles pour une autre commande ?

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?
Linux
  1. Qu'est-ce qui définit la taille maximale d'un seul argument de commande ?

  2. Qu'est-ce qu'un bon mnémonique pour Shell Double Vs. Guillemets simples?

  3. Comment désactiver un alias dans Bash pour une seule commande ? ?

  4. Suppression des guillemets simples et doubles dans une chaîne à l'aide des commandes Linux bash / standard uniquement

  5. Comment remplacer les guillemets simples par un autre caractère dans sed ?

10 tutoriels de commande Linux pour débutants et experts

Utilisation de drush pour la sauvegarde/restauration et la migration du site Drupal

Installer le sous-système Windows pour Linux avec une seule commande

50 commandes grep productives et pratiques pour les passionnés de Linux

Tutoriels et exemples de commande Linux Head pour les débutants

Remplacer le trait de soulignement par une virgule et supprimer les guillemets doubles dans CSV