la commande "cd" associés à l'argument "&" Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
petitchat
Membre
Membre
Messages : 13
Inscription : 15 janv. 2022, 23:44
Status : Hors-ligne

Salut les amis,
Pour m'amuser je code un terminal en javascript, je code d'abord les commandes essentielles et en ce moment je m'intéresse à la commande "cd". En essayant de "cd" différentes chaîne de caractères dans ma debian je me suis rendu compte que le caractère "&" produit un résultat singulier. Si je tape la commande:

Code : Tout sélectionner

cd &
j'obtiens une cryptique ligne en retour:

Code : Tout sélectionner

[1] 15857
puis si je tape "entrée" une autre ligne cryptique:

Code : Tout sélectionner

petitchat@debian11:~$
[1]+  Fini                    cd
Donc ma question est: savez vous à quoi sert l'argument "&" ? Savez vous comment on l'utilise ? je n'ai pas trouvé d'info dans le man ( "man cd" ne marche pas, il faut faire "help cd" pour avoir un blabla d'aide succinct). J'ai besoin de cette info pour savoir si je code cette fonction ou non. Merci pour vos réponses érudites.
MicP
Modérateur
Modérateur
Messages : 779
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bonjour

Ce n'est pas une argument donné à la commande cd mais une fonctionnalité de l'interpréteur de commandes bash

En faisant suivre la commande cd par le caractère & tu as mis l'exécution de la commande cd en tâche de fond (<=> en arrière plan),
et le retour de commande t'indique le numéro d'ordre de la tâche suivit du numéro de processus de la tâche de fond concernée suivit de la ligne de commande qui a été lancée en tâche de fond
jusqu'à ce que la tâche soit terminée => le numéro de processus est remplacé par Fini pour indiquer que l'exécution de la tâche concernée est terminée
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Salut!

C'est marrant cette histoire,
comme des trucs simples peuvent nous échapper (dans une 1ère approche)
sans la réponse de MicP, j'aurais retourné cela dans tous les sens :wacko:

En fait comme la tâche est très courte, y-a peut-être même pas le temps de la passer en arrière-plan ??? :017:

Code : Tout sélectionner

$ cd &  pgrep cd
[1] 730337
[1]+  Fini                    cd

ça m'épate toujours comme tous ces programmes sont bien faits :icon_e_ugeek:
Debian stable - XFCE
MicP
Modérateur
Modérateur
Messages : 779
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

C'est utile (entre autres) quand on n'a accès qu'à une seule fenêtre de terminal (ou bien si on veut n'en utiliser qu'une seule)
dans laquelle on voudrait pouvoir lancer une ou plusieurs lignes de commande(s) dont l'exécution prendrait beaucoup de temps.

Tant que l'exécution de la première ligne de commande ne serait pas terminée, nous serions obligé d'attendre la fin d'exécution de la ligne de commande lancée avant de pouvoir lancer une autre ligne de commande.

En lançant la ligne de commande en tâche de fond, le prompt revient aussitôt nous permettant ainsi d'entrer une seconde ligne de commande
sans avoir a attendre la fin de l'exécution de la première ligne de commande entrée, la première ligne de commande continuant son travail en tâche de fond.

On peut ainsi lancer successivement plusieurs lignes de commandes dont l'exécution se fera en tâche de fond.

========
On peut remettre en premier plan une des commandes qui aurait été lancée en tâche de fond
en utilisant la commande fg (foreground <=> premier plan) suivie du caractère % puis du numéro de la tâche concernée.
voir aussi bg jobs et le chapitre CONTRÔLE DES TÂCHES dans les pages man de l'interpréteur de commande bash
en lançant la ligne de commande suivante :

Code : Tout sélectionner

man --pager='less -p "^CONTRÔLE DES TÂCHES"|"[^&<>]&[^&<>]"|"bg"|"fg"|"jobs"' bash
(puis appuyez sur n ou N pour naviguer dans les pages du manuel)
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

MicP a écrit : 29 juin 2022, 23:14 On peut remettre en premier plan une des commandes qui aurait été lancée en tâche de fond
en utilisant la commande fg (foreground <=> premier plan) suivie du caractère % puis du numéro de la tâche concernée.
Merci pour ces précisions

:good:

@+
Debian stable - XFCE
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 3928
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

J'utilise le ¹ assez souvent dans mes scripts d'automatisation. Par exemple pour ouvrir plusieurs programmes que j'utilise simultanément. Chaque ligne de lancement se termine par un ¹, car chaque logiciel lancé vis ensuite sa vie tant que je ne le ferme pas.
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Autre remarque :

Il me semble avoir lu (il y a longtemps) que dans une liste de commandes :

cmde1 & cmde2 et cmde1 ; cmde2 sont équivalents.

Mais à la lueur de cette discussion je commence à en douter,
même si du à la probable brièveté de la 1ère commande on peut en avoir l'illusion,
ce n'est pas le cas :

Code : Tout sélectionner

$ sha256sum tails-amd64-5.0.img ; date
cc6ca9d9b688bc9ead1b9a6a633f13732920cf64c4b0d05b7a24770a995498cd  tails-amd64-5.0.img
jeu. 30 juin 2022 22:17:16 CEST
il faut attendre la fin du calcul de la somme sha256 pour avoir la date.

Alors que :

Code : Tout sélectionner

$ sha256sum tails-amd64-5.0.img & date
[1] 2190945
jeu. 30 juin 2022 22:17:27 CEST

$ cc6ca9d9b688bc9ead1b9a6a633f13732920cf64c4b0d05b7a24770a995498cd  tails-amd64-5.0.img

fg %1
bash: fg : la tâche s'est terminée
[1]+  Fini                    sha256sum tails-amd64-5.0.img
affiche(presque) immédiatement la date, ... puis la somme calculée.

Je ne sais pas si c'est une erreur courante ou une bêtise perso
... mais je prends maintenant pleinement conscience de la différence.
Debian stable - XFCE
petitchat
Membre
Membre
Messages : 13
Inscription : 15 janv. 2022, 23:44
Status : Hors-ligne

Merci MicP et tous pour vos réponses passionnantes, j'ignorai totalement qu'on pouvait envoyer une commande en tâche de fond avec '&'. Qui du coup effectivement n'est pas un argument de la commande. D'ailleurs comment on appelle ce '&' ? un commutateur ? C'est un caractère avec une fonction spéciale comme '|' ou '>', je ne sais pas comment on dit.
ça m'épate toujours comme tous ces programmes sont bien faits :icon_e_ugeek:
Moi aussi clairement. Je ne sais pas encore comment cette découverte fortuite va me servir à l'avenir. Jusqu'alors pour faire plusieurs tâches en même temps je lançais plusieurs terminaux ssh jusqu'à ce que je découvre y a pas longtemps la commande "screen".
Conséquence: ce '&' n'a rien à voir avec la commande 'cd' que je cherche à programmer, tant mieux ça fera ça de moins de code à faire.
En réalité j'utilisais déjà cette commande sans le savoir, quand ma sœur me téléphone et me raconte les histoires de ses copines je fais déjà spontanément un:

Code : Tout sélectionner

listen sister & <une autre tâche>
Merci encore :good:
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

petitchat a écrit : 01 juil. 2022, 04:36 C'est un caractère avec une fonction spéciale comme '|' ou '>', je ne sais pas comment on dit.

Je vais faire mon kéké, mais c'est MicP qui l'a montré hier :

$ man --pager='less -p "^DEFINITIONS"' bash

:rtfm: :043:
Debian stable - XFCE
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

J'espère pour toi que ta sœur ne s'est pas mise à utiliser Debian à ton insu et qu'elle lise cela ... tu serais probablement très très mal :diablo:
Debian stable - XFCE
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 3755
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

petitchat a écrit : 01 juil. 2022, 04:36

Code : Tout sélectionner

listen sister & <une autre tâche>

:rofl:
Debian stable. XFCE.
Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
MicP
Modérateur
Modérateur
Messages : 779
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

dezix a écrit :… J'espère pour toi que ta sœur ne s'est pas mise à utiliser Debian à ton insu et qu'elle lise cela ... tu serais probablement très très mal …
Et si elle est susceptible (si si, j'en connais des comme ça)
elle pourrait même te reprocher de l'avoir traitée de "tâche"
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

MicP a écrit : 01 juil. 2022, 21:08 l'avoir traitée de "tâche"

Cher Dupont, je dirais même pire : "... de tâche de fond"
ce qui n'est vraiment pas plaisant !
Debian stable - XFCE
MicP
Modérateur
Modérateur
Messages : 779
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

Bien vu :good:
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Avec un peu d'entraînement,
nous allons bientôt pouvoir monter une troupe d'humoristes.
:rofl:
Debian stable - XFCE
Avatar de l’utilisateur
vv222
Modérateur
Modérateur
Messages : 580
Inscription : 18 avr. 2016, 20:14
Localisation : Bretagne
Contact :
Status : Hors-ligne

dezix a écrit : 30 juin 2022, 22:29 Il me semble avoir lu (il y a longtemps) que dans une liste de commandes :

cmde1 & cmde2 et cmde1 ; cmde2 sont équivalents.
Tu confonds peut-être avec cmde1 && cmde2, qui n’est pas tout à fait équivalent à cmde1 ; cmde2 mais a quand même un comportement proche.

À savoir qu’en shell & et && n’ont absolument rien à voir l’un avec l’autre, ce qui peut facilement être une source de confusion.
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

vv222 a écrit : 02 juil. 2022, 12:34 Tu confonds peut-être avec cmde1 && cmde2

Oui, c'est bien possible.

l'important c'est que MicP a remis les pendules à l'heure.

:good:
Debian stable - XFCE
MicP
Modérateur
Modérateur
Messages : 779
Inscription : 16 avr. 2016, 22:14
Status : Hors-ligne

cmde1 & cmde2 et cmde1 ; cmde2 sont équivalents.
Oui, enfin presque : le résultat sera peut-être le même, mais la façon dont ça va se faire est différente.

Code : Tout sélectionner

cmde1 & cmde2
cmde1 sera d'abord lancée en tâche de fond
et cmde2 sera lancée sans attendre la fin d'exécution de cmde1

=======

Code : Tout sélectionner

cmde1 ; cmde2
cmde2 ne sera lancée qu'après l'exécution de cmde1

=======

Code : Tout sélectionner

cmde1 && cmde2
C'est seulement si cmde1 a pu se terminer sans erreur que cmde2 sera lancée.
<=> Si le code d'erreur retourné à la fin d'exécution de cmde1 est égal à zéro, Alors cmde2 sera lancée

=======

Code : Tout sélectionner

cmde1 || cmde2
C'est seulement si cmde1 s'est terminée avec une erreur que cmde2 sera lancée.
<=> Si le code d'erreur retourné à la fin d'exécution de cmde1 est différent de zéro , Alors cmde2 sera lancée
Avatar de l’utilisateur
dezix
Modérateur
Modérateur
Messages : 2050
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Un tampon à se coller sur le front (moi le premier) :

rigueur.png
(la gravure faisant trop mal)


MicP est exempté, il a du tombé dedans tout petit... :clapping:
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Debian stable - XFCE
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 3928
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

c'est pour ça qu'on trouve souvent la séquence:

Code : Tout sélectionner

apt update && apt upgrade
Si l'update se passe mal, inutile de lancer l'upgrade.
Répondre