Existe-t-il un moyen pour un programme de ligne de commande compilé d'indiquer à bash ou à csh qu'il ne souhaite pas développer de caractères génériques dans ses paramètres?
Par exemple, on pourrait vouloir une commande shell comme:
foo *
pour renvoyer simplement la valeur ASCII numérique de ce caractère.
pwd
,echo *
c'est juste*
nullglob
est désactivée, le mot reste inchangé. Si l'nullglob
option est définie et qu'aucune correspondance n'est trouvée, le mot est supprimé."set -f
? C'est çaunset -f
?set +f
S'il est vrai qu'une commande elle-même ne peut pas désactiver la globalisation, il est possible pour un utilisateur de dire à un shell Unix de ne pas glober une commande particulière. Ceci est généralement accompli en éditant les fichiers de configuration d'un shell. En supposant que la commande
foo
se trouve le long du chemin de la commande, les éléments suivants doivent être ajoutés au fichier de configuration approprié:Pour les shells, bash et ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
Pour les shells csh et tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
Pour le shell zsh:
alias foo='noglob foo'
Le chemin de commande n'a pas à être utilisé. Dites que la commande foo est stockée dans le répertoire ~ / bin, alors ce qui précède deviendrait:
Pour les shells, bash et ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
Pour les shells csh et tcsh:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Pour le shell zsh:
alias foo='noglob ~/bin/foo'
Tout ce qui précède a été testé avec l'OSX 10.9.2 d'Apple. Remarque: lors de la copie du code ci-dessus, veillez à ne pas supprimer les espaces. Ils peuvent être importants.
Mise à jour:
L'utilisateur geira a souligné que dans le cas d'un shell bash
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
pourrait être remplacé par
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
ce qui élimine le besoin de la fonction foo.
Certains sites Web utilisés pour créer ce document:
Shell Unix
Passer des arguments de ligne de commande à une commande d'alias bash
Csh - Le shell C
Commandes intégrées Bash
Comparaison avec les séquences de démarrage Bourne shell et csh
Boucle d'alias dans csh
Comment passer des arguments de ligne de commande à un alias shell?
Appel d'un programme lorsqu'une fonction bash porte le même nom
Variables shell spéciales
Alias de shell C avec arguments de ligne de commande
Empêcher l'expansion / Globbing Wildcard dans les scripts Shell
la source
L'expansion est effectuée par le shell avant l'exécution de votre programme. Votre programme ne sait pas si une expansion a eu lieu ou non.
set -o noglob
désactivera l'expansion dans le shell appelant, mais vous devrez le faire avant d'appeler votre programme.
L'alternative est de citer vos arguments par exemple
foo "*"
la source
set -o noglob
pour désactiver l'expansion des caractères génériques.Attention: s'il n'y a pas de nom correspondant au masque, bash passe l'argument tel quel, sans développement!
Preuve (pa.py est un script très simple, qui imprime juste ses arguments):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
la source
set -o nullglob
oushopt -s failglob
, et ce comportement changera (de deux manières très différentes).