Empêcher l'expansion de *

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Gilles
Le #22871491
Ref:
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
Benoit Izac
Le #22871741
Bonjour,

le 01/12/2010 à 20:52, Vincent Verdon a écrit dans le message

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
Vincent Verdon
Le #22872031
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

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
Benoit Izac
Le #22872081
Bonjour,

le 01/12/2010 à 22:15, Vincent Verdon a écrit dans le message

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
Éric Lévénez
Le #22872071
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 -- Unix is not only an OS, it's a way of life.
Nicolas George
Le #22872161
Benoit Izac , dans le message
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 ?
Benoit Izac
Le #22872151
Bonjour,

le 01/12/2010 à 22:37, Nicolas George a écrit dans le message

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
Vincent Verdon
Le #22872141
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
Stephane CHAZELAS
Le #22872981
2010-12-01, 21:00(+01), Gilles:
Ref:
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
Lucas Levrel
Le #22873131
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
Publicité
Poster une réponse
Anonyme