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

Ambiguous redirect en shell

5 réponses
Avatar
Kevin Denis
Bonjour,

je suis tombe sur un comportement bizarre en shell:
kevin@slack:~/tmp$ echo data > fichier autre chose
kevin@slack:~/tmp$ cat fichier
data autre chose

Ce comportement m'etonne. Comment l'expliquer?

d'un autre cote, j'en aurais peut etre l'utilite, mais quand je
scripte avec une variable:

kevin@slack:~/tmp$ FILE="b autre chose"
kevin@slack:~/tmp$ echo data > $FILE
-bash: $FILE: ambiguous redirect
kevin@slack:~/tmp$

Comment faire pour obtenir le meme comportement qu'au dessus?

Merci
--
Kevin

5 réponses

Avatar
Alain Ketterlin
Kevin Denis writes:

je suis tombe sur un comportement bizarre en shell:
:~/tmp$ echo data > fichier autre chose


Tu peux même écrire "> fichier echo data autre chose". C'est comme ça,
les redirections peuvent apparaître n'importe où dans la ligne. Je ne
sais pas de quand ça date. L'avantage ? J'imagine que c'est plus
facile à programmer...

d'un autre cote, j'en aurais peut etre l'utilite, mais quand je
scripte avec une variable:

:~/tmp$ FILE="b autre chose"
:~/tmp$ echo data > $FILE
-bash: $FILE: ambiguous redirect


Heureusement. Trop dangereux.

-- Alain.

Avatar
Stephane Chazelas
2007-10-31, 15:56(+00), Kevin Denis:
Bonjour,

je suis tombe sur un comportement bizarre en shell:
:~/tmp$ echo data > fichier autre chose
:~/tmp$ cat fichier
data autre chose

Ce comportement m'etonne. Comment l'expliquer?


Par le fait que les operateurs de redirections peuvent etre
placés n'importe ou.

d'un autre cote, j'en aurais peut etre l'utilite, mais quand je
scripte avec une variable:

:~/tmp$ FILE="b autre chose"
:~/tmp$ echo data > $FILE
-bash: $FILE: ambiguous redirect
:~/tmp$

Comment faire pour obtenir le meme comportement qu'au dessus?
[...]


eval "echo data > $file_and_other_arguments"

Si tu veux rediriger vers le fichier dont le chemin est contenu
dans la variable FILE, c'est

echo data > "$FILE"

toujours mettre des quotes autour des variables (sauf si on a
une bonne raison de ne pas le faire (ce qui entend comprendre ce
qu'on fait))

--
Stéphane

Avatar
Kevin Denis
Le 31-10-2007, Stephane Chazelas a écrit :
je suis tombe sur un comportement bizarre en shell:
:~/tmp$ echo data > fichier autre chose
:~/tmp$ cat fichier
data autre chose

Ce comportement m'etonne. Comment l'expliquer?


Par le fait que les operateurs de redirections peuvent etre
placés n'importe ou.

D'accord, j'ignorais.


d'un autre cote, j'en aurais peut etre l'utilite, mais quand je
scripte avec une variable:

:~/tmp$ FILE="b autre chose"
:~/tmp$ echo data > $FILE
-bash: $FILE: ambiguous redirect
:~/tmp$

Comment faire pour obtenir le meme comportement qu'au dessus?
[...]


eval "echo data > $file_and_other_arguments"

Ah oui, tout simplement en fait.


Si tu veux rediriger vers le fichier dont le chemin est contenu
dans la variable FILE, c'est

echo data > "$FILE"

Oui. Mais la, justement non. Je pensais a la variable FILE

qui pourrait bien evidemment contenir
fichier --options args

qui risque de creer le bon fichier d'une part, et de me
permettre ensuite d'avoir une variable FILE qui pourra avoir
des effets de bords interessants.

toujours mettre des quotes autour des variables (sauf si on a
une bonne raison de ne pas le faire


Je m'interrogeais justement sur les implications en terme
de securite. Il doit y avoir moyen de faire des injections de
code.

(ce qui entend comprendre ce qu'on fait))

C'est bien pour ca que je viens demander a la docte assemblee

d'eclairer ma lanterne.
Merci
--
Kevin


Avatar
Stephane Chazelas
2007-10-31, 17:03(+00), Kevin Denis:
[...]
eval "echo data > $file_and_other_arguments"
[...]


Oui. Mais la, justement non. Je pensais a la variable FILE
qui pourrait bien evidemment contenir
fichier --options args

qui risque de creer le bon fichier d'une part, et de me
permettre ensuite d'avoir une variable FILE qui pourra avoir
des effets de bords interessants.


c'est chercher les ennuies...

toujours mettre des quotes autour des variables (sauf si on a
une bonne raison de ne pas le faire


Je m'interrogeais justement sur les implications en terme
de securite. Il doit y avoir moyen de faire des injections de
code.
[...]


Avec "eval", on ne peux pas faire plus "injection de code". eval
est la commande pour "evaluer" le code passé en argument.

Donc,

FILE='file; rm -rf -- "${HOME:-/}"'
eval "echo foo > $FILE"

est la meme chose qu'ecrire:

echo foo > file; rm -rf -- "${HOME:-/}"

--
Stéphane


Avatar
Benoit Izac
Bonjour,

le 31/10/2007 à 18:23, Stephane Chazelas a écrit dans le message
:

Donc,

FILE='file; rm -rf -- "${HOME:-/}"'
eval "echo foo > $FILE"

est la meme chose qu'ecrire:

echo foo > file; rm -rf -- "${HOME:-/}"


Je viens de tester ; la deuxième commande m'a paru beaucoup plus rapide
que la première qui étrangement avait pris plus d'une minute avant que
je reprenne la main. J'en arrive à la conclusion que ce n'est pas tout
à fait équivalent.

Bon, je vais lire le fil suivant « Snapshopts incrémentaux tournants ».
Depuis le temps que je me dis qu'il faut que je fasse enfin une
sauvegarde de mes données, je sens que ça va m'intéresser.

--
Benoit Izac (Oups !)