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

Empêcher l'expansion de *

11 réponses
Avatar
Vincent Verdon
Bonjour à tous,

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il s'agit
du symbole *.
Y-a-t-il une solution ? Je cherche sans trouver :-(

Amicalement, Vincent Verdon

10 réponses

1 2
Avatar
Gilles
Ref: <4cf6a6fc$0$27735$ de Vincent Verdon

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il s'agit
du symbole *.
Y-a-t-il une solution ? Je cherche sans trouver :-(




Ben, suffit de protéger l'argument entre simples ou doubles quotes (" ou ') lors
de l'appel, tout simplement (ou alors je n'ai pas bien compris la question...)
--
Gilles
Avatar
Benoit Izac
Bonjour,

le 01/12/2010 à 20:52, Vincent Verdon a écrit dans le message
<4cf6a6fc$0$27735$ :

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il
s'agit du symbole *.



set -f

--
Benoit Izac
Avatar
Vincent Verdon
Bonsoir,

Le 01/12/2010 21:16, Benoit Izac a écrit :
Bonjour,

le 01/12/2010 à 20:52, Vincent Verdon a écrit dans le message
<4cf6a6fc$0$27735$ :

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il
s'agit du symbole *.



set -f




Hélas non, j'ai déjà essayé.

Un exemple :
#!/bin/bash
set -f
OP=$1
echo "parametre = $1"

Si je passe en paramètre du script *, cela renvoie le nom du premier
fichier rencontré dans le rep courant.
Si je veux récupérer *, je dois passer '*' en paramètre.

J'imagine que Bash commence son travail d'expansion dès la lecture du
script : il fait l'expansion de * et place le résultat dans $1, avant de
prendre en compte set -f.

Merci de la réponse.

Amicalement, Vincent Verdon
Avatar
Benoit Izac
Bonjour,

le 01/12/2010 à 22:15, Vincent Verdon a écrit dans le message
<4cf6ba8e$0$5223$ :

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il
s'agit du symbole *.



set -f




Hélas non, j'ai déjà essayé.

Un exemple :
#!/bin/bash
set -f
OP=$1
echo "parametre = $1"

Si je passe en paramètre du script *, cela renvoie le nom du premier
fichier rencontré dans le rep courant.
Si je veux récupérer *, je dois passer '*' en paramètre.

J'imagine que Bash commence son travail d'expansion dès la lecture du
script : il fait l'expansion de * et place le résultat dans $1, avant
de prendre en compte set -f.



C'est exactement ça, c'est le shell qui appelle le script qui fait
l'expansion. Donc soit tu fais un « set -f » dans ton shell courant,
soit tu échappes * : sh script.sh *

--
Benoit Izac
Avatar
Éric Lévénez
Le 01/12/10 22:15, Vincent Verdon a écrit :

Si je passe en paramètre du script *, cela renvoie le nom du premier
fichier rencontré dans le rep courant.
Si je veux récupérer *, je dois passer '*' en paramètre.



Sous Windows, c'est les commandes qui traitent les arguments, mais sous
Unix, c'est le shell qui fait ce travail. Ainsi le * sera interprété par
le shell comme la liste des fichiers du répertoire courant (si la liste
n'est pas trop longue), puis le shell script sera appelé avec cette
liste, et donc plus de *. Le cas où * est passé tel-quel est le cas où
il n'y a pas de fichier dans le répertoire courant (en ignorant ceux qui
sont cachés).

Exemple :avec "echo" à la place du shell

mkdir a && cd a && echo * && touch b c && echo * && rm b c && cd .. &&
rmdir a
*
b c


--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
Nicolas George
Benoit Izac , dans le message , a écrit :
J'imagine que Bash commence son travail d'expansion dès la lecture du
script : il fait l'expansion de * et place le résultat dans $1, avant
de prendre en compte set -f.


C'est exactement ça, c'est le shell qui appelle le script qui fait
l'expansion.



Pourquoi commences-tu ton message par « c'est exactement ça » si tu le
continues en disant exactement le contraire de ce qu'il a dit ?
Avatar
Benoit Izac
Bonjour,

le 01/12/2010 à 22:37, Nicolas George a écrit dans le message
<4cf6c021$0$7650$ :

J'imagine que Bash commence son travail d'expansion dès la lecture du
script : il fait l'expansion de * et place le résultat dans $1, avant
de prendre en compte set -f.


C'est exactement ça, c'est le shell qui appelle le script qui fait
l'expansion.



Pourquoi commences-tu ton message par « c'est exactement ça » si tu le
continues en disant exactement le contraire de ce qu'il a dit ?



Sans doute parce que j'ai lu trop vite et j'ai compris :
bash (celui qui appelle le script) commence son travail d'expansion dès
la lecture du script : ...

--
Benoit Izac
Avatar
Vincent Verdon
Bonsoir,


Le 01/12/2010 22:27, Éric Lévénez a écrit :
Le 01/12/10 22:15, Vincent Verdon a écrit :

Si je passe en paramètre du script *, cela renvoie le nom du premier
fichier rencontré dans le rep courant.
Si je veux récupérer *, je dois passer '*' en paramètre.



Sous Windows, c'est les commandes qui traitent les arguments, mais sous
Unix, c'est le shell qui fait ce travail. Ainsi le * sera interprété par
le shell comme la liste des fichiers du répertoire courant (si la liste
n'est pas trop longue), puis le shell script sera appelé avec cette
liste, et donc plus de *. Le cas où * est passé tel-quel est le cas où
il n'y a pas de fichier dans le répertoire courant (en ignorant ceux qui
sont cachés).

Exemple :avec "echo" à la place du shell

mkdir a && cd a && echo * && touch b c && echo * && rm b c && cd .. &&
rmdir a
*
b c




Evidemment, et, en plus je le savais...

Merci à tous pour vos explications.

--
Amicalement, Vincent Verdon
Avatar
Stephane CHAZELAS
2010-12-01, 21:00(+01), Gilles:
Ref: <4cf6a6fc$0$27735$ de Vincent Verdon

j'ai un script bash qui est appelé avec un argument qui peut être "*".

Je ne parviens pas à empêcher l'expansion de l'argument quand il s'agit
du symbole *.
Y-a-t-il une solution ? Je cherche sans trouver :-(




Ben, suffit de protéger l'argument entre simples ou doubles quotes (" ou ') lors
de l'appel, tout simplement (ou alors je n'ai pas bien compris la question...)



Si le shell courant est zsh, on peut faire:

alias script.bash='noglob script.bash'

Alors, zsh n'"expand" pas les globbing patterns pour l'appel des
commandes script.bash.

C'est util par exemple dans:

alias wmv='noglob zmv -W'

Avec ça, tu peux faire:

wmv *.xml *.html

par exemple

--
Stephane
Avatar
Lucas Levrel
Le 2 décembre 2010, Stephane CHAZELAS a écrit :

Si le shell courant est zsh, on peut faire:

alias script.bash='noglob script.bash'

Alors, zsh n'"expand" pas les globbing patterns pour l'appel des
commandes script.bash.



Est-ce qu'on peut faire la même chose avec bash, ou dois-je créer un
script du type :
---
#!/bin/bash
set -f
mmv "$@"
---
?

Merci.
--
LL
1 2