2010-10-29 25 views
1

Je suis en train d'exécuter la ligne suivante du script bash sous Mac OS X 10.6.4 (de this question):Mac OS X - bash extension de chemin par défaut ou bug

$ export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"' 

Hélas, ce que je reçois est quelque chose d'inattendu:

$ echo $ EDITOR
mvim -f -c "VimLeave fille au bureau Documents Logithèque Films musique Images bin Sites publics ouverts Terminal -a!"

Le résultat attendu serait:

$ echo $ EDITOR
mvim -f -c "au VimLeave *! Ouvrir -a Terminal"

La façon de résoudre ce problème à cela est de mettre noglob, à savoir exécuter set -f immédiatement avant la export affectation. Cependant, la question qui se pose est de savoir si c'est le comportement attendu sous Mac OS X, car (parce que noglob est unset par défaut, à savoir set +f) ou parce qu'il ya un bogue dans bash sous Mac OS X.

La version de bash est:

 
$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin10.0) 
Copyright (C) 2007 Free Software Foundation, Inc. 

il peut y avoir une aide par le biais de la page 329 du A practical guide to Unix for Mac OS X users: « à moins noglob (page 320) est activée, les exécute shell [d'extension pathname] lorsqu'il rencontre une référence de fichier ambigu - un jeton contenant l'un des caractères non indiqués &,?, [, ou]. ". Cependant, étant donné que le * globbed est entre guillemets, la question demeure: le comportement est-il un paramètre par défaut de bash, ou un bogue?

Ceci est juste une curiosité, mais je serais reconnaissant pour toutes les pensées et les commentaires que vous pourriez avoir.

Brian

Répondre

7

Votre EDITOR variables est correctement réglé. Vous pouvez le voir si vous exécutez:

echo "$EDITOR" 

Jetez un oeil à la transcription suivante:


pax> export EDITOR='mvim -f -c "au VimLeave * !open -a Terminal"' 

pax> echo $EDITOR 
mvim -f -c "au VimLeave SecretCiaDoc.txt NsaEchelonKeys.txt !open -a Terminal" 

pax> echo "$EDITOR" 
mvim -f -c "au VimLeave * !open -a Terminal" 

Votre problème ne réside pas dans la déclaration set mais avec votre echo. Le set ne développera pas le * car il est contenu entre des guillemets simples mais en faisant un echo sans guillemets va le le développer.

Cela n'affecte en rien les programmes qui utilisent la variable d'environnement.


Sur la base de votre commentaire:

C'est encore étrange: que * est toujours entre guillemets (les guillemets doubles) pour la commande echo. a='abc "*" xyz'; echo $a ne se développe pas pour moi dans bash ou tiret; en fait, il inclut les citations comme deuxième argument.

Voir ceci:

pax> a='abc "*" xyz' ; echo $a 
abc "*" xyz 

pax> a='abc "* xyz' ; echo $a 
abc "* xyz 

pax> a='abc " * xyz' ; echo $a 
abc " SecretCiaDoc.txt NsaEchelonKeys.txt xyz 

pax> touch '"hello' ; a='abc "* xyz' ; echo $a 
abc "hello xyz 

Voir ce qui se passe. Il ne traite pas le " comme quelque chose de spécial, juste un autre personnage. La raison pour laquelle il se développe pour votre EDITOR est parce qu'il est tout seul. Lorsque vous utilisez "*", il essaie en fait d'étendre les fichiers qui commencent et se terminent par " - vous pouvez le voir dans mon dernier exemple ci-dessus.

+0

Ceci est encore étrange: que \ * est * toujours entre guillemets * (les guillemets doubles) pour la commande echo. 'a = 'abc" * "xyz'; echo $ a' ne s'étend pas pour moi dans bash ou dash; en fait, il inclut les citations comme deuxième argument. –

+0

Remarque: Je ne suis pas en train de tester sur OS X mais je cours bash 4.1.5; il semble qu'il y ait probablement une option shell différente qui explique ce comportement, mais je ne le trouve pas. –

+0

@Roger, consultez la mise à jour, j'espère que cela va l'expliquer. – paxdiablo