Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/06/2021, à 13:04

zephyre123

[RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Bonjour,

Je lis un livre avec un maximum d'exemple pour me familiariser avec la ligne de commande.
J'en suis à la commande watch qui permet de lancer une commande avec une fréquence régulière.
L'exemple qui est donné est le suivant :
watch -n 60 `from | tail`
La commande from  permet de voir les email envoyé sur le serveur de messagerie local par les utilisateurs.
La commande tail sans paramètre permet d'afficher les 10 dernières lignes.
Ainsi je comprends un peu près comment la commande fonctionne mais je ne comprends pas pourquoi on met des back quote.
Pouvez vous me donner une explication svp ?
La dernière fois que je vous avais posé la question sur les back quote pour faire une substitution de commande vous m'aviez dit que cette manière de faire était obsolète et qu'on utilisait maintenant le dollar = $commande
J'aimerai savoir si c'est la même chose ici ?

Merci d'avance pour votre aide.

Dernière modification par zephyre123 (Le 06/06/2021, à 16:39)

Hors ligne

#2 Le 06/06/2021, à 13:12

abelthorne

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

https://www.gnu.org/software/bash/manua … ution.html
Ça permet d'interpréter une commande et ça renvoie le retour. Càd que ta commande from | tail va être exécutée à part et son retour va être passé en paramètre à watch -n 60.

Je ne saurais pas te dire si cette méthode est complètement obsolète mais on peut apparemment utiliser $() à la place. A priori, la syntaxe suivante fonctionnerait aussi :

watch -n 60 $(from | tail)

Dernière modification par abelthorne (Le 06/06/2021, à 13:13)

Hors ligne

#3 Le 06/06/2021, à 13:13

Vobul

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Salut,

Oui les backquote c'est pour faire une "sous-commande". Et en effet désormais on utilisera $(from|tail). Mais dans ce cas ce ne sont pas des backquotes, mais des quotes normales. Regarde "man watch", parmi les exemples :

watch -d 'ls -l | fgrep joe'

Ce sont des quotes normales, il n'y a pas de sous-commande à faire là.


Vobul
Utilisez le retour utilisable de commandes !!!
J'aime la langue française, mais je parle franglais, deal with it.
RTFM

Hors ligne

#4 Le 06/06/2021, à 13:27

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

En cherchant sur le net je suis tombé la dessus = https://qastack.fr/unix/27428/what-does … n-commands
Il dise ceci :
Ceci est un backtick . Un backtick n'est pas un signe de citation. Cela a une signification très spéciale. Tout ce que vous tapez entre les backticks est évalué (exécuté) par le shell avant la commande principale (comme chowndans vos exemples), et la sortie de cette exécution est utilisée par cette commande, comme si vous tapiez cette sortie à cet endroit de la liste. ligne de commande.

Je suis désolé mais je ne comprends pas.
J'ai l'impression que l'on change ordonnancement de l’exécution de la commande par le shell. Es ce que c'est ça ?
Avez vous d'autres exemples ou on utilise les backquotes ou le dollar ou les quotes simples afin que je comprenne quand on doit les utiliser ?
J'ai remarquer qu'on les utilises souvent lorsque il y a des jokers en particulier * dans les commandes.

Pourquoi par exemple avec la commande suivante on utilise le $ :
watch -n 60 $(ls -l *.jpeg) => suivre l'avance du téléchargement d'une série de photo.
Je comprends pas pourquoi on utilise le $ dans ce cas.

Dernière modification par zephyre123 (Le 06/06/2021, à 13:37)

Hors ligne

#5 Le 06/06/2021, à 13:36

abelthorne

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Un exemple très simple : la commande id -u renvoie ton id d'utilisateur (1000 sur Ubuntu pour le premier compte). Si tu lances la commande suivante (l'une ou l'autre syntaxe) :

echo `id -u`
echo $(id -u)

le shell va exécuter id -u et renvoyer le retour (1000) à echo.

Dernière modification par abelthorne (Le 06/06/2021, à 13:37)

Hors ligne

#6 Le 06/06/2021, à 13:41

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

ok alberthorne j'ai compris ce que tu veux dire.
Mais dans le cas de cette commande :
watch -n 60 $(ls -l *.jpeg)
Pourquoi on utilise le $ ?
Supposons qu'on ne mette pas le dollar alors
la commande deviendrai :
watch -n 60 ls -l  fichier1.jpeg fichier2.jpeg fichier3.jpeg etc etc
Je ne vois pas ce que ça change de mettre un dollar dans ce cas ?

Hors ligne

#7 Le 06/06/2021, à 13:48

abelthorne

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

$(xxx) est une façon apparemment plus moderne de faire `xxx` (où xxx serait une commande). C'est une syntaxe spécifique qui est différente de (xxx).

Dernière modification par abelthorne (Le 06/06/2021, à 13:49)

Hors ligne

#8 Le 06/06/2021, à 13:52

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Oui j'ai compris alberthorne que $(commande) est plus moderne que `commande`
Mais je ne vois pas ce que ça change dans le cas de cette commande de mettre un $ ou pas et pourtant il en faut un sinon la commande ne fonctionne pas.
Avec cette commande :
watch -n 60 $(ls -l *.jpeg)

Sans le dollar = $ la commande devient :
watch -n 60 ls -l  fichier1.jpeg fichier2.jpeg fichier3.jpeg etc etc

Avec le dollar = $ la commande devient :
idem

Donc pourquoi ça marche dans un cas et pas dans un autre c'est cela que je pige pas.

Hors ligne

#9 Le 06/06/2021, à 13:59

jplemoine

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Ce qu'il faut que tu comprennes est que ce n'est pas $ mais $().
$(xxx) permet d’exécuter xxx avant le reste
Dans ton cas précis :
on fait ls -l *.jpeg ce qui donne un résultat que l'on stocke de manière temporaire : fichier1.jpeg fichier2.jpeg fichier3.jpeg
puis on exécute watch -n 60 <résutat précédent>

Si tu ne mets pas le $, la commande devient watch -n 60 (ls -l *.jpeg) et non watch -n 60 ls -l  fichier1.jpeg fichier2.jpeg fichier3.jpeg


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#10 Le 06/06/2021, à 14:00

ar barzh paour

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

essaie de lancer dans un terminal

watch $(ls -l *.x)

et

watch ls -l *.x

dans le 1er cas tu obtiens un message d'erreur ( ls impossible d'accéder à ... ou bien watch : option invalide -- 'r' )
dans le 2ème cas tu obtiens toutes les 2 secondes le résultat de ls -l *.x

Dernière modification par ar barzh paour (Le 06/06/2021, à 14:07)


PC          : B760M DS3H DDR4,  12th Gen Intel(R) Core(TM) i3-12100, RAM DDR4 8GiB -2400 Ubuntu 22.04, 22.04, 23.04
Portable1 : Intel(R) Core(TM)2 Duo CPU     T6570  @ 2.10GHz RAM 4GiB DDR2 667 MHz Ubuntu 23.04 ( en voyage )
Portable2 : T5750  @ 2.00GHz RAM 1GiB DDR2 667 Mhz Ubuntu 20.04 ( batterie HS )
stourm a ran war bep tachenn (Angela Duval) ( Je combats sur tous les fronts )

Hors ligne

#11 Le 06/06/2021, à 15:02

jplemoine

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

En fait, il faut faire

watch --help

qui donne

Usage:
 watch [options] commande

Options:
..

il faut donc passer en paramètre une commande et non son résultat.
Comme la commande comporte des espaces, on va mettre des guillemets pour que watch considère la commande comme un et seul paramètre

watch "ls -l *"

Va envoyer la commande

ls -l *

toutes les 2secondes.

Dans le premier exemple de "ar barzh paour" (un peu modifié) :

watch $(ls -l *)

On envoie le résultat de ls -ld * en paramètre de watch : il y aura donc probablement une erreur de syntaxe.

Par contre, on pourrait générer un fichier dynamique avec du code au-dessus que l'on simulera et on peut ensuite passer la dite commande en paramètre.

# declaration du nom de fichier
file="test_forum.txt"
# on simule un remplissage dynamique
echo "ls -l *" > /tmp/$file
# on appelle watch
watch "$(cat /tmp/${file})"

NB : il est évidement que l'on est dans un cas d'école et que l’intérêt n'est que pédagogique (désolé, étant admin linux et non formateur, je suis au max en non préparé).


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#12 Le 06/06/2021, à 15:06

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

J'ai compris ce que vous vouliez me dire mais vous ne répondez pas à ma question mais c'est de ma faute j'ai été un peu vague donc je vais préciser.

Avec $(commande) :
watch -n 60 $(ls -l *.jpeg) => on exécute en premier ls -l *.jpeg => la commande devient watch -n 60 fichier1.jpeg fichier2.jpeg fiichier3.jpeg etc

Sans $(commande):
watch -n 60 ls -l *.jpeg => on exécute de gauche à droite et en premier la commande wartch. Comme *.jpeg est remplacé par fichier1.jpeg fichier2.jpeg fichier3.jpeg etc etc alors la commande devient la même chose que avec le $(commande)
c'est à dire watch -n 60 fichier1.jpeg fichier2.jpeg fichier3.jpeg etc etc

Donc je ne comprends pas pourquoi dans ce cas il faut utiliser le $(commande)

J'espère avoir été clair.

C'est cela que je ne comprends pas. Les deux commandes devraient donner le même résultat.
Je ne parle pas spécifiquement de la commande watch, la commande watch est un exemple parmi tant d'autres.

Dernière modification par zephyre123 (Le 06/06/2021, à 15:21)

Hors ligne

#13 Le 06/06/2021, à 15:21

MicP

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Bonjour

La commande watch attend, comme paramètre, un nom de fichier exécutable (suivit, éventuellement, par les paramètres qui seront donnés à cet exécutable lors de son lancement)

la commande devient watch -n 60 fichier1.jpeg fichier2.jpeg fiichier3.jpeg etc

Dans le cas de la ligne de commande :

watch -n 60 fichier1.jpeg fichier2.jpeg fichier3.jpeg etc

fichier1.jpeg n'est pas un fichier exécutable,
alors, la commande watch ne pourra retourner qu'un message d'erreur :

sh: 1: fichier1.jpeg: Exec format error

indiquant qu'elle a essayé de lancer l'exécution du premier fichier qu'on lui a donné en paramètre
pensant qu'il s'agissait du nom d'un programme exécutable.

=======
Donc, l'exécution de la ligne de commande :

watch -n 60 fichier1.jpeg fichier2.jpeg fichier3.jpeg etc

donnera :

Toutes les 60,0s: fichier1.jpeg fichier2.jpeg fichier3.jpeg etc               debsid: Sun Jun  6 15:13:45 2021

sh: 1: fichier1.jpeg: Exec format error

===================================
===================================
Par contre, avec la ligne de commande :

watch -n 60 ls -l *.jpeg

la commande watch va, toutes les minutes, lancer la ligne de commande suivante :

ls -l *.jpeg

ce qui pourrait donner chez toi,
quelque chose qui ressemble à ce qui est ci-dessous :

Toutes les 60,0s: ls -l fichier1.jpeg fichier2.jpeg fichier3.jpeg               debsid: Sun Jun  6 15:36:05 2021

-rwxr-xr-x 1 michel michel 78411  6 sept.  2019 fichier1.jpg
-rwxr-xr-x 1 michel michel 50805 12 juil.  2019 fichier2.jpg
-rwxr-xr-x 1 michel michel 41603 12 août   2019 fichier3.jpg

Dernière modification par MicP (Le 08/06/2021, à 04:43)

Hors ligne

#14 Le 06/06/2021, à 15:34

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Ok MicP j'ai compris essayons alors la même logique et remplaçons la commande watch par la commande find.
Exemple
find ~ -name *.pdf   => donne une erreur
find ~ -name "*.pdf" => fonctionne

Je ne comprends pas pourquoi ?

-name ne prends qu'un et un seul paramètre donc c'est normal que la commande find ~ name *.pdf foire car la commande va devenir find -name fichier1.pdf fichier2.pdf etc etc donc on a plusieurs arguments avec -name
La deuxième commande je comprends pas pourquoi elle fonctionne.

Hors ligne

#15 Le 06/06/2021, à 15:48

MicP

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Là, c'est un problème qui n'a rien à voir avec la commande watch
puisqu'il s'agit d'un problème qui concerne la commande find
… et donc => Hors sujet dans ce fil de discussion => il vaudrait mieux ouvrir un autre fil de discussion et/ou voir la page man de la commande find

Hors ligne

#16 Le 06/06/2021, à 15:53

Watael

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

là, ce n'est pas le même mécanisme.

dans le cas de find, quand tu ne mets pas de guillemets, le shell qui effectue le Développement des chemins (voir l'expression dans le man) avant d'exécuter le find.
par contre, quand il y a des guillemets, l'expression est un argument passé à find, qui traitera lui-même la substitution.

EDIT: mais c'est en effet un autre sujet, dont on a déjà discuté il y a quelque temps
si quelqu'un la retrouve... moi, je n'ai pas réussi.

Dernière modification par Watael (Le 06/06/2021, à 15:55)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#17 Le 06/06/2021, à 16:39

zephyre123

Re : [RESOLUQue signifie les back cote dans une ligne de commande exemple ?

Ok c'est clair pour moi j'ai tout compris.
Merci pour votre temps et votre aide wink

Hors ligne