Question Espaces dans les variables environnementales Linux?


Répertoire donné: /media/foo/can haz/bar, J'ai essayé l'édition bash.rc avec:

export Foo=/media/foo/can haz/bar
export Foo=/media/foo/can\ haz/bar
export Foo='/media/foo/can haz/bar'
export Foo="/media/foo/can haz/bar"
export Foo='"/media/foo/can haz/bar"'
export Foo="'/media/foo/can haz/bar'"

Cependant, à chaque fois, je ne pouvais pas faire quelque chose comme ça pour travailler (sans utiliser "$Foo"):

cd $Foo

Comment définir une variable d'environnement avec des espaces sur un système Linux?


4
2017-07-06 18:13


origine


Peut-être que si je mets un alias ou quelque chose? - A T


Réponses:


Le problème n'est pas que votre variable d'environnement contient un espace. Vous oubliez de citez vos arguments:

cd "$Foo"

Si vous ne citez pas $Foo, la cd commande verra effectivement deux arguments (ou plus), depuis les espaces par défaut séparent les arguments. Dans votre cas spécifique, vous passeriez /media/foo/can et haz/bar séparément, car la coquille les sépare dans l'espace. La double citation des variables est une bonne habitude à développer et vous permettra de gagner beaucoup d’espaces blancs.

Si vous voulez une façon vraiment laide d’atteindre cet objectif sans les citations, écrasez votre cd Builtin comme ça:

cd() { builtin cd "$*"; }

Cela fonctionnera si le chemin contient des espaces, depuis $* contiendra les arguments individuels (/media/foo/can et haz/bar), séparés par le premier caractère IFS (généralement un espace), puis vous les collerez avec les guillemets doubles.

Ce n'est jamais une bonne idée d'écraser des construit comme ça, cependant.


8
2017-07-06 18:17



Comme mentionné, je veux éviter de le faire; c'est le problème que j'essaie de résoudre. - A T
Avez-vous faufilé cette partie? Je ne me souviens pas avoir été là lors de la première révision de la question que j'ai vue :) En tout cas, votre question est: "Comment définir une variable environnementale avec un espace?", Et la réponse est que vous pouvez le faire. Comment vous le traitez est un problème différent, et que vous ne pouviez pas le faire fonctionner sans guillemets est juste une question de fonctionnement du shell. - slhck
@AT Avez-vous vu ma mise à jour? - slhck


Comme l'a dit @slhck, la méthode correcte consiste à placer des guillemets doubles autour de la référence de la variable (par ex. cd "$Foo"). La raison en est l'ordre dans lequel le shell analyse différents aspects de la ligne de commande: il recherche d'abord les guillemets et les échappements (et les supprime au fur et à mesure de leurs effets), puis remplace les références variables (par ex. $Foo -> /media/foo/can haz/bar), il repasse ensuite les valeurs remplacées et applique une extension générique (*.txt -> a.txt b.txt etc) et le fractionnement des mots (/media/foo/can haz/bar -> "/ media / foo / can" "haz / bar"), mais il ne revient jamais en arrière et recherche des guillemets et / ou des fuites dans les valeurs des variables. Par conséquent, l'incorporation de citations et / ou d'échappements dans la valeur d'une variable rien même légèrement utile; au moment où ils font partie de la ligne de commande, il est trop tard pour qu’ils aient l’effet voulu. Je ne connais que trois façons d'éviter le fractionnement de mots sur la valeur étendue:

  1. Double-citer la référence de variable. Ce n'est pas aussi pratique, mais c'est une exigence de la syntaxe shell standard.
  2. Modifiez la valeur de IFS (la liste des caractères utilisés pour le fractionnement de mots sur des variables étendues). Puis regardez comme tous les scripts qui dépendent du comportement standard de fractionnement des mots. Merci de ne pas le faire. Sérieusement.
  3. Basculer vers un shell qui ne divise pas les mots sur les variables étendues: zsh. Vous devrez vous habituer à ses autres différences par rapport à bash, mais si vous le voulez vraiment, c'est la meilleure façon de procéder. Je ne l'utilise pas moi-même, mais ceux qui ont l'air de l'apprécier beaucoup ...

2
2017-07-06 21:32



Zsh aussi se complète très bien cd $Foo à cd /path\ with/spaces. J'ai trouvé Bash pour le faire mal si vous le déclenchez avec Ctrl-A-E, mais je n'ai pas utilisé Bash depuis un certain temps, il serait donc possible de le configurer également. - slhck