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

[Shell] aide sur les pipe

14 réponses
Avatar
daniel
Bonjour,
Bon, ce formu est ma dernière chance, parce que ça fait trois jours que
je me prend la tête sur un problème de script qui maiche pas mais je
sais pas pourquoi.
Alors voilà, j'ai un fichier qui contient trois lignes de texte,et qui
s'appelle test.txt, par exemple :
Truc
Bidule
Chose

Le but du script que je cherche à faire est d'attribuer à trois
variables différentes (par exemple a, b et c) chaque ligne de ce fichier.
Pas la peine de se prendre la tête à essayer de trouver une solution
alternative, j'en ai déjà une qui marche, ce que je voudrais comprendre,
c'est pourquoi ma solution ne marche pas et comment la faire marcher
voilà mon script :
cat test.txt | read a b c

Voilà
Merci d'avance à ceux qui me répondront

10 réponses

1 2
Avatar
Benoit Izac
Bonjour,

le 27/04/2004 à 17:59, daniel a écrit
dans le message <408e834d$0$26994$ :

Alors voilà, j'ai un fichier qui contient trois lignes de texte,et qui
s'appelle test.txt, par exemple :
Truc
Bidule
Chose

Le but du script que je cherche à faire est d'attribuer à trois
variables différentes (par exemple a, b et c) chaque ligne de ce
fichier.
Pas la peine de se prendre la tête à essayer de trouver une solution
alternative, j'en ai déjà une qui marche, ce que je voudrais
comprendre, c'est pourquoi ma solution ne marche pas et comment la
faire marcher
voilà mon script :
cat test.txt | read a b c


selon susv3 :
NAME
read - read a line from standard input
SYNOPSIS
read [-r] var...
DESCRIPTION
The read utility shall read a single line from standard input.

Comme je suppose que tu n'as pas modifié IFS, ton script va lire la
première ligne soit « Truc » va l'affecter à « a » et comme il n'y a
plus rien derrière, « b » et « c » vont rester vides.

cat test.txt | tr 'n' ' ' | read a b c

--
Benoit Izac

Avatar
Benoit Izac
Dans le message ,

cat test.txt | tr 'n' ' ' | read a b c


D'ailleurs avant que l'on me sorte un UUOC :
tr 'n' ' ' < test.txt | read a b c

--
Benoit Izac

Avatar
daniel
selon susv3 :
NAME
read - read a line from standard input
SYNOPSIS
read [-r] var...
DESCRIPTION
The read utility shall read a single line from standard input.

Comme je suppose que tu n'as pas modifié IFS, ton script va lire la
première ligne soit « Truc » va l'affecter à « a » et comme il n'y a
plus rien derrière, « b » et « c » vont rester vides.

cat test.txt | tr 'n' ' ' | read a b c



oui, je suis tout a fait d'accord ça devrai marcher...mais ça marche pas
quand j'essai : la premiere version du script (sans le tr au milieu) la
logique voudrait que la premiere ligne soit affectée à "a" mais en fait
les trois variables restent vides...lorsqu'on mets le tr au milieu...pareil.
Je ne comprend pas du tout pourquoi, bon, ok j'utilise windows et j'ai
cygwin comme interpréteur mais ce qui est plus surprenant c'est que j'ai
essayé sur les PC de ma fac qui tournent sous linux red hat et que
j'obtiens le même résultat...ou plutot l'absence de résultat

Avatar
Éric Lévénez
Le 27/04/04 18:25, dans , « Benoit Izac »
a écrit :

le 27/04/2004 à 17:59, daniel a écrit
dans le message <408e834d$0$26994$ :

Alors voilà, j'ai un fichier qui contient trois lignes de texte,et qui
s'appelle test.txt, par exemple :
Truc
Bidule
Chose

Le but du script que je cherche à faire est d'attribuer à trois
variables différentes (par exemple a, b et c) chaque ligne de ce
fichier.
Pas la peine de se prendre la tête à essayer de trouver une solution
alternative, j'en ai déjà une qui marche, ce que je voudrais
comprendre, c'est pourquoi ma solution ne marche pas et comment la
faire marcher
voilà mon script :
cat test.txt | read a b c


selon susv3 :
NAME
read - read a line from standard input
SYNOPSIS
read [-r] var...
DESCRIPTION
The read utility shall read a single line from standard input.

Comme je suppose que tu n'as pas modifié IFS, ton script va lire la
première ligne soit « Truc » va l'affecter à « a » et comme il n'y a
plus rien derrière, « b » et « c » vont rester vides.

cat test.txt | tr 'n' ' ' | read a b c


Mais que vient faire ce cat ? C'est souvent une commande forkée en trop.

Autre solution :

{ read a; read b; read c; } < test.txt

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
JustMe
Éric Lévénez wrote:

Le 27/04/04 18:25, dans , « Benoit Izac »


le 27/04/2004 à 17:59, daniel a écrit
dans le message <408e834d$0$26994$ :


Alors voilà, j'ai un fichier qui contient trois lignes de texte,et qui
s'appelle test.txt, par exemple :
Truc
Bidule
Chose

Le but du script que je cherche à faire est d'attribuer à trois
variables différentes (par exemple a, b et c) chaque ligne de ce
fichier.
Pas la peine de se prendre la tête à essayer de trouver une solution
alternative, j'en ai déjà une qui marche, ce que je voudrais
comprendre, c'est pourquoi ma solution ne marche pas et comment la
faire marcher
voilà mon script :
cat test.txt | read a b c


selon susv3 :
NAME
read - read a line from standard input
SYNOPSIS
read [-r] var...
DESCRIPTION
The read utility shall read a single line from standard input.

Comme je suppose que tu n'as pas modifié IFS, ton script va lire la
première ligne soit « Truc » va l'affecter à « a » et comme il n'y a
plus rien derrière, « b » et « c » vont rester vides.

cat test.txt | tr 'n' ' ' | read a b c



Mais que vient faire ce cat ? C'est souvent une commande forkée en trop.

Autre solution :

{ read a; read b; read c; } < test.txt



tu assignes une variable dans un subshell et tu esperes qu'elle va
remonter par magie ?

allons...



Avatar
Éric Lévénez
Le 27/04/04 19:51, dans <c6m6io$a6o$, « JustMe »
a écrit :

Éric Lévénez wrote:

Autre solution :

{ read a; read b; read c; } < test.txt


tu assignes une variable dans un subshell et tu esperes qu'elle va
remonter par magie ?


Oui, car les accolades indiquent d'utiliser le shell courant, contrairement
aux parenthèses. Cette méthode permet aussi de ne pas lancer des shells
annexes comme tr ou cat...

allons...


Oui ? :->

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
JustMe
Éric Lévénez wrote:

Le 27/04/04 19:51, dans <c6m6io$a6o$, « JustMe »


Éric Lévénez wrote:


Autre solution :

{ read a; read b; read c; } < test.txt


tu assignes une variable dans un subshell et tu esperes qu'elle va
remonter par magie ?



Oui, car les accolades indiquent d'utiliser le shell courant, contrairement
aux parenthèses. Cette méthode permet aussi de ne pas lancer des shells
annexes comme tr ou cat...


oups... faut que je change de lunettes : j'avais vu des ()

Désolé...



allons...



Oui ? :->





Avatar
Stephane Chazelas
2004-04-27, 19:56(+02), Éric Lévénez:
[...]
Autre solution :

{ read a; read b; read c; } < test.txt


tu assignes une variable dans un subshell et tu esperes qu'elle va
remonter par magie ?


Oui, car les accolades indiquent d'utiliser le shell courant, contrairement
aux parenthèses. Cette méthode permet aussi de ne pas lancer des shells
annexes comme tr ou cat...


A noter toutefois que dans certains Bourne shells, rediriger un
groupe de commande implique que le groupe est lancé dans un
sous-shell. Cela dit, on ne doit plus trouver beaucoup de tels
shells, de nos jours.


--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]



Avatar
Bernard Merlant
In article <BCB46B62.70C39%, Éric Lévénez wrote:
Le 27/04/04 19:51, dans <c6m6io$a6o$, « JustMe »
tu assignes une variable dans un subshell et tu esperes qu'elle va
remonter par magie ?


Oui, car les accolades indiquent d'utiliser le shell courant, contrairement
aux parenthèses. Cette méthode permet aussi de ne pas lancer des shells
annexes comme tr ou cat...


C'est interessant ces accolades. Je ne connaissais pas. Je vais tester si
cela peut résoudre un problème similaire que j'ai avec une donnée présente
dans un paramètre.


Avatar
Stephane Chazelas
2004-04-27, 20:03(+01), Stephane Chazelas:
A noter toutefois que dans certains Bourne shells, rediriger un
groupe de commande implique que le groupe est lancé dans un
sous-shell. Cela dit, on ne doit plus trouver beaucoup de tels
shells, de nos jours.


A part le /bin/sh de Solaris, ce qui en fait une exception
notable.

{ read a; read b; } < file

ne marchera pas.

exec 3< file
read a <&3
read b <&3
exec 3<&-

marchera.


--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

1 2