10 votes

Existe-t-il un moyen de désactiver l'interpolation de l'astérisque * pour certaines commandes bash ?

J'aimerais être capable d'écrire * à mon script, et à obtenir * en l'état (c'est-à-dire sans expansion).

Bash essaiera de le remplacer par des fichiers locaux correspondant à ce motif, et si ce motif n'existe pas, bash passera l'astérisque sans modifications.

Je ne veux pas m'échapper. Je sais que c'est possible ( *, '*' ).

par exemple

myscript --arg *   --- will pass local files to the script
myscript --arg=*   --- will pass "--arg=*", since there are no filenames starting with "--arg=<...>"

Puis-je dire à bash d'ignorer l'interprétation des caractères génériques dans certaines occasions ? Par exemple, avec les commandes commençant par myscript ?

18voto

jeremysprofile Points 301

Oui. Vous pouvez utiliser set -f :

set -f
echo *  # prints *
# turn glob expansion back on, if you want:
set +f

Si vous choisissez cette voie, vous devrez le définir dans le terminal où vous appelez votre script, et non pas dans votre script lui-même, car l'option * se développe avant d'atteindre votre script en tant qu'argument.

Comme il a été mentionné dans les commentaires, il est probablement préférable de simplement échapper à l'élément * soit par '*' , "*" o \* .

0voto

jrw32982 Points 148
$ cat myscript
for a ;do echo "-$a-"; done
exit 7

$ cat setup
myscript_helper() { set +o noglob; ./myscript "$@"; }
alias myscript='set -o noglob; myscript_helper'

$ source setup

$ myscript *; echo $? *
-*-
7 myscript setup

myscript est votre script externe. Ici, c'est juste echo s ses arguments et sort avec un statut de sortie de 7 . setup est le script permettant de créer une fonction d'aide et un alias ; il doit être source d (en pointillé) pour ajouter la fonction et l'alias à votre Shell actuel.

Lorsque vous exécutez myscript l'alias est appelé et set -o noglob (même chose que set -f ) s'exécute avant que les arguments soient analysés et transmis à myscript_helper . Lorsque la fonction myscript_helper s'exécute (dans le Shell actuel), il réinitialise d'abord noglob avant d'appeler le script. myscript avec les arguments spécifiés et en retournant le statut de sortie ( 7 dans ce cas).

Ce hack ne doit être utilisé que pour un usage interactif. Les résultats pourraient être très surprenants dans ce cas d'utilisation particulier, mais la technique générale peut être utilisée dans une variété de situations. Par exemple, j'utilise cette méthode pour appeler (en ligne de commande) un script. xyz qui doit être source d, mais l'alias xyz prend soin de source dans le script. xyz pour moi.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X