pipe connaître la commande appellante ?

12 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
Benoit Izac
Bonjour,

le 04/07/2012 à 08:51, Une Bévue a écrit dans le message
<4ff3e7d6$0$16489$ :

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 ?



Non, pas dans l'état. « | » envoie la sortie standard de ce qui est
à gauche sur l'entrée de ce qui est à gauche. Par conséquent mon_script
n'a aucune idée de la commande précédente.

si oui, comment ?



Si tu peux modifier mon_script, il faut que ce soit lui qui exécute
« mon_bin mon_fichier », ta ligne de commande devient :
/path/to/mon_script mon_bin mon fichier

un truc du genre :
#!/bin/sh
CMD="$@"
echo "la commande est : $CMD"
$CMD | cat

./test.sh grep @ test.sh
la commande est : grep @ test.sh
CMD="$@"

Ensuite, tout dépend de ce que tu veux faire mais comme tu ne l'as pas
indiqué...

--
Benoit Izac
Avatar
Luc.Habert.00__arjf
Benoit Izac :

CMD="$@"
echo "la commande est : $CMD"
$CMD | cat



Mais non, quoi. "$@" | cat
Avatar
Une Bévue
Le 04/07/12 10:54, Luc Habert a écrit :
Benoit Izac :

>CMD="$@"
>echo "la commande est : $CMD"
>$CMD | cat


Mais non, quoi. "$@" | cat



euh, chez moi (shell zsh sur Mac OS X) il n'y a rien dans $@
Avatar
Benoit Izac
Bonjour,

le 04/07/2012 à 11:02, Une Bévue a écrit dans le message
<4ff406b4$0$6820$ :

>CMD="$@"
>echo "la commande est : $CMD"
>$CMD | cat


Mais non, quoi. "$@" | cat



euh, chez moi (shell zsh sur Mac OS X) il n'y a rien dans $@



J'en doute fort ($@ est POSIX) ; essaye :
% cat test.sh
#!/bin/sh
"$@" | cat
% zsh ./test.sh grep '@" |' ./test.sh
"$@" | cat

--
Benoit Izac
Avatar
YBM
Le 04.07.2012 08:51, Une Bévue a écrit :

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 ?



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

si oui, comment ?



comme ça :

$ cat getleft
#!/bin/sh

LEFTPID=$(
find /proc/[0-9]*/fd -maxdepth 1 -name 1
-exec echo -n {} ' ' ;
-exec readlink {} ; 2> /dev/null |
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
Avatar
YBM
Le 04.07.2012 13:56, YBM a écrit :
$ cat getleft
#!/bin/sh

LEFTPID=$(
find /proc/[0-9]*/fd -maxdepth 1 -name 1
-exec echo -n {} ' ' ;
-exec readlink {} ; 2> /dev/null |



petit détail :
-exec readlink {} ; 2> /dev/null | grep -F pipe |

(pour être sûr que stdin est un tube)

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.
Avatar
Une Bévue
Le 04/07/12 14:08, YBM a écrit :
| grep -F pipe |



OK, merci, mon grep ne doit pas être le même :
$ sleep 10 | ./getleft.sh
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

$ grep --version
grep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Avatar
moi-meme
Le Wed, 04 Jul 2012 14:17:37 +0200, Une Bévue a écrit :

OK, merci, mon grep ne doit pas être le même



man grep
Avatar
Une Bévue
Le 04/07/12 16:56, moi-meme a écrit :
OK, merci, mon grep ne doit pas être le même


man grep



grep n'est pas le problème, sur Mac OS X, il n'y a pas de /proc.

je ne sais où trouver l'équivalent.
Avatar
Fabien LE LEZ
On Wed, 04 Jul 2012 17:38:12 +0200, Une Bévue
:

sur Mac OS X, il n'y a pas de /proc.



Ah ben oui, effectivement, MacOS X n'est pas un Linux, c'est un BSD.
1 2