Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pipe connaître la commande appellante ?

16 réponses
Avatar
Une Bévue
soit la commande :

$ mon_bin mon_fichier | /path/to/mon_script

je voudrais pouvoir récupérer dans "mon_script" la commande précédente,
càd ce qu'il y a avant le pipe "|", ici "mon_bin mon_fichier".
Avec tous les arguments.

est-ce possible ?

si oui, comment ?

10 réponses

1 2
Avatar
patpro ~ patrick proniewski
In article <4ff4641d$0$16496$,
Une Bévue wrote:

soit la commande :

$ mon_bin mon_fichier | /path/to/mon_script

je voudrais pouvoir récupérer dans "mon_script" la commande précédente,
càd ce qu'il y a avant le pipe "|", ici "mon_bin mon_fichier".
Avec tous les arguments.

est-ce possible ?

si oui, comment ?



je ne crois pas que tu puisses de manière déterministe, pour la simple
raison que dans le cas du pipe, c'est le shell qui est le parent des
deux process :

$ ls | sleep 15 & ps

USER PID PPID %CPU %MEM TTY STARTED STAT COMMAND
patpro 83130 83129 0.0 0.0 ttys004 10:04PM S -bash
patpro 48848 83130 0.0 0.0 ttys004 7:33PM R (ls)
patpro 48849 83130 0.0 0.0 ttys004 7:33PM S sleep 15

pid bash -> 83130
pid ls -> 48848, parent 83130
pid sleep -> 48849, parent 83130

Dans un enchaînement A|B tu ne peux donc pas retrouver de manière
certaine le pid de la commande A à partir de la commande B. Il y a une
race condition qui peut faire que les deux PID n'ont pas un point
d'écart, mais plus, voire le cas où tu recycles un PID totalement
différent parce que tu as atteint la valeur max.

bref, bon courage :)

patpro

--
A vendre : KVM IP 16 ports APC
http://patpro.net/blog/index.php/2008/01/12/133
Avatar
Une Bévue
Le 04/07/12 19:41, patpro ~ patrick proniewski a écrit :
Dans un enchaînement A|B tu ne peux donc pas retrouver de manière
certaine le pid de la commande A à partir de la commande B. Il y a une
race condition qui peut faire que les deux PID n'ont pas un point
d'écart, mais plus, voire le cas où tu recycles un PID totalement
différent parce que tu as atteint la valeur max.



Quelqu'un m'a donné ça sur fr.comp.os.linux.configuration :


$ cat getleft
#!/bin/sh

LEFTPID=$(
find /proc/[0-9]*/fd -maxdepth 1 -name 1
-exec echo -n {} ' ' ;
-exec readlink {} ; 2> /dev/null | grep -F pipe |
grep -F $( readlink /proc/$$/fd/0 ) | cut -f1 -d' ' | cut -f3 -d/
)

echo $LEFTPID

ps u -p$LEFTPID 2> /dev/null

$ sleep 10 | ./getleft
16643
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
tv 16643 0.0 0.0 2996 620 pts/0 S+ 13:55 0:00 sleep 10

$ ls | ./getleft

$ cat /vmlinuz | ./getleft
16843
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
tv 16843 0.0 0.0 3000 600 pts/0 S+ 13:55 0:00 cat
/vmlinuz


Mais bon, il avait comme toi des doutes :

"si la commande de gauche a terminée, c'est trop tard... et
pire, "

le principe :
"sinon ça liste tous les processus dont le stdout est
notre stdin, et donc pas mal de choses si stdin est un
terminal et pas un tube. "

mais bon pas de /proc sur Mac OS X.
Avatar
Paul Gaborit
À (at) Wed, 04 Jul 2012 17:41:17 +0200,
Une Bévue écrivait (wrote):

soit la commande :

$ mon_bin mon_fichier | /path/to/mon_script

je voudrais pouvoir récupérer dans "mon_script" la commande précédente,
càd ce qu'il y a avant le pipe "|", ici "mon_bin mon_fichier".
Avec tous les arguments.

est-ce possible ?



Réponse courte : non !

Réponse longue : expliquez-nous pouquoi vous avez besoin de cela et on
vous expliquera comment vous en passer !

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Une Bévue
Le 05/07/12 14:42, Paul Gaborit a écrit :
Réponse longue : expliquez-nous pouquoi vous avez besoin de cela et on
vous expliquera comment vous en passer !



Oui, c'est vrai, la bonne solution est de s'en passer...

Quand j'installe qqc sur mon mac, généralement je copie la session au
terminal dans un fichier.

Pour m'y répérer, j'enregistre le fichier avec un nom comportant la date
en préfixe suivi du nom de la commande, du genre :

"12-07-05--sudo gem1.9 install truc.txt"

pour l'instant je fais :
$ sudo gem1.9 install truc
<ce que donne la commande>

puis :

$ fdate "sudo gem1.9 install truc" (donc au term je fais flèche vert le
haut et je met la dernière commande entre "" précédée de fdate puis je
copie le résultat de la commande dans le fichier créé.

Naïvement je pensais qu'une commande simple permettait d'avoir la
commande précédente dans un script (mon fdate), une sorte d'history
(comme dans le fichier ~/.zsh/zsh_history).

Je voulais m'éviter des copiés / collés.
Avatar
blanc
Une Bévue wrote:

$ fdate "sudo gem1.9 install truc" (donc au term je fais flèche vert le
haut et je met la dernière commande entre "" précédée de fdate puis je
copie le résultat de la commande dans le fichier créé.

Naïvement je pensais qu'une commande simple permettait d'avoir la
commande précédente dans un script (mon fdate), une sorte d'history
(comme dans le fichier ~/.zsh/zsh_history).

Je voulais m'éviter des copiés / collés.



Il me semble que tu es en zsh.
Donc au lieu de ce qui précède tu peux faire :

$ fdate"!!" >> fichier_ou_tu_veux_copier_le_résultat

(j'ai mis un double '>' car j'ai cru comprendre que le fichier existait
déjà)

Ceci étant, si c'est toujours le même type de commande que tu fais,
personnellement je ferais un script avec comme argument(s) les seuls
noms qui changent. Quelque chose dans le genre de :

-----------------
#!/bin/zsh

sudo gem1.9 install $1
echo "sudo gem1.9 install $1" >> fichier_ou_tu_veux_copier_le_résultat
-----------------

Et j'appellerais ce script en mettant en argument ce qui change :

monscript truc.txt

Mais je ne suis pas sûr d'avoir bien compris ce qui changeait dans tes
différentes commandes, ni ce que tu veux faire exactement.
--
JiPaul.
/ /--/--// Jean-Paul Blanc
|/| L | quelquepart en (somewhere in)
/|| = ||| FRANCE
Avatar
Paul Gaborit
À (at) Thu, 05 Jul 2012 17:51:57 +0200,
Une Bévue écrivait (wrote):

Le 05/07/12 14:42, Paul Gaborit a écrit :
Réponse longue : expliquez-nous pouquoi vous avez besoin de cela et on
vous expliquera comment vous en passer !



Oui, c'est vrai, la bonne solution est de s'en passer...



Ne pas y penser, c'est le syndrome XY...

Quand j'installe qqc sur mon mac, généralement je copie la session au
terminal dans un fichier.

Pour m'y répérer, j'enregistre le fichier avec un nom comportant la date
en préfixe suivi du nom de la commande, du genre :

"12-07-05--sudo gem1.9 install truc.txt"

pour l'instant je fais :
$ sudo gem1.9 install truc
<ce que donne la commande>



Ok.

puis :

$ fdate "sudo gem1.9 install truc" (donc au term je fais flèche vert le
haut et je met la dernière commande entre "" précédée de fdate puis je
copie le résultat de la commande dans le fichier créé.



C'est quoi `fdate` ?

Naïvement je pensais qu'une commande simple permettait d'avoir la
commande précédente dans un script (mon fdate), une sorte d'history
(comme dans le fichier ~/.zsh/zsh_history).

Je voulais m'éviter des copiés / collés.



Pourquoi ne pas créer une petite commande (un script ou une fonction de
votre shell - lequel au fait) qui fait exactement tout cela ?

Au passage, cette commande/fonction pourrait filtrer ce qui n'est pas
acceptable en tant que nom de fichier dans la commande...

N'ayant pas de `fdate` sur mes différentes machines et OS, je ne sais
pas à quoi ça sert. Je ne peux donc pas vous fournir plus d'aide pour
l'instant (c'est tout un art de se faire aider!).

--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Avatar
Une Bévue
Le 06/07/12 08:57, Paul Gaborit a écrit :
$ fdate "sudo gem1.9 install truc" (donc au term je fais flèche vert le
>haut et je met la dernière commande entre "" précédée de fdate puis je
>copie le résultat de la commande dans le fichier créé.


C'est quoi `fdate` ?



un script bêbête (fdate == file dated ))) qui prend un argument disons :

$ fdate <nom du fichier sans extenion>

et qui produit un mkdir de la date :
$ mkdir -p ~/Installations/<année>/<mois>/<jour>

et enregistre dans ce dossier, un fichier qui aura pour nom :

<heure>-<minutes>-<secondes>--<nom du fichier sans extenion>.txt

puis ouvre ce fichier pour que je puisse y faire mon copié collé du
terminal.

accessoirement fdate, filtre <nom du fichier sans extenion> si par ex il
y a des "/" dans la commande précédente à fdate, je m'arrange aussi pour
qu'il n'y ait pas d'espaces.

>Naïvement je pensais qu'une commande simple permettait d'avoir la
>commande précédente dans un script (mon fdate), une sorte d'history
>(comme dans le fichier ~/.zsh/zsh_history).
>
>Je voulais m'éviter des copiés / collés.


Pourquoi ne pas créer une petite commande (un script ou une fonction de
votre shell - lequel au fait) qui fait exactement tout cela ?



J'utilise Zsh de MacPorts, en fait je dois dire que j'utilis--ais--
celui de MacPorts car bizarement en changeant mes zshenv et zshrc (dans
/opt/local/etc) je suis passé au zsh Apple...

ça m'a énervé, donc j'ai laissé tombé -- pour le moment--.

Euh, j'utilise aussi beaucoup ruby comme langage de script, dès que je
ne connais pas la syntaxe en zsh...

Hier j'ai eu un problème avec Zsh : je me suis rendu compte qu'on ne
peut pas faire un dirname d'un fichier qui n'existe pas, alors j'ai
basculé en ruby, où seule la string est prise en compte.
mais bon yaptet une option à dirname / zsh.

Au passage, cette commande/fonction pourrait filtrer ce qui n'est pas
acceptable en tant que nom de fichier dans la commande...



oui, je le fais dans fdate.

N'ayant pas de `fdate` sur mes différentes machines et OS, je ne sais
pas à quoi ça sert. Je ne peux donc pas vous fournir plus d'aide pour
l'instant (c'est tout un art de se faire aider!).



c'est ben vrai ça )))
Avatar
Une Bévue
Le 06/07/12 08:40, JiPaul a écrit :
Il me semble que tu es en zsh.
Donc au lieu de ce qui précède tu peux faire :

$ fdate"!!" >> fichier_ou_tu_veux_copier_le_résultat



euh, là, je ne pige pas, c'est quoi "!!" un truc spécial à zsh ?

(j'ai mis un double '>' car j'ai cru comprendre que le fichier existait
déjà)

Ceci étant, si c'est toujours le même type de commande que tu fais,
personnellement je ferais un script avec comme argument(s) les seuls
noms qui changent. Quelque chose dans le genre de :

-----------------
#!/bin/zsh

sudo gem1.9 install $1
echo "sudo gem1.9 install $1" >> fichier_ou_tu_veux_copier_le_résultat
-----------------



ah ouais mais ce que je veux copier dans mon fichier ce n'est pas
commande, c'est le résultat de ma commande un exemple pour être clair :

après la commande :
$ sudo gem1.9 install net-ping

j'ai enregistré un fichier :
~/Installations/12/07/02/21-43-18--sudo gem1.9 install net-ping.txt

le script ouvre ce fichier automatqiuement dans un editeur qcq.

de contenu (obtenu par copié/collé au term) :
Fetching: net-ldap-0.2.2.gem (100%)
Fetching: ffi-1.0.11.gem (100%)
Building native extensions. This could take a while...
Fetching: net-ping-1.5.3.gem (100%)
Successfully installed net-ldap-0.2.2
Successfully installed ffi-1.0.11
Successfully installed net-ping-1.5.3
3 gems installed
Installing ri documentation for net-ldap-0.2.2...
Installing ri documentation for ffi-1.0.11...
Installing ri documentation for net-ping-1.5.3...
Installing RDoc documentation for net-ldap-0.2.2...
Installing RDoc documentation for ffi-1.0.11...
Installing RDoc documentation for net-ping-1.5.3...

soit, le résultat de la commande "sudo gem1.9 install net-ping"

Et j'appellerais ce script en mettant en argument ce qui change :

monscript truc.txt

Mais je ne suis pas sûr d'avoir bien compris ce qui changeait dans tes
différentes commandes, ni ce que tu veux faire exactement.
Avatar
Erwan David
Une Bévue écrivait :


ah ouais mais ce que je veux copier dans mon fichier ce n'est pas
commande, c'est le résultat de ma commande un exemple pour être clair



script -c 'mon script' résultat.txt

Et tu as la sortie dans résultat.txt


--
Le travail n'est pas une bonne chose. Si ça l'était,
les riches l'auraient accaparé
Avatar
Une Bévue
Le 06/07/2012 12:09, Erwan David a écrit :
script -c 'mon script' résultat.txt

Et tu as la sortie dans résultat.txt



super, merci beaucoup, je savais bien qu'il y avait une solution simple )))
1 2