Espaços nas variáveis ambientais do Linux?

4

Dado o diretório: /media/foo/can haz/bar , eu tentei editar bash.rc com:

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'"

De cada vez, porém, não consegui fazer algo como o seguinte funcionar (sem usar "$Foo" ):

cd $Foo

Como eu defino uma variável ambiental com espaços em um sistema Linux?

    
por A T 06.07.2013 / 20:13

2 respostas

8

O problema não é que sua variável ambiental contenha um espaço. Você está esquecendo de citar seus argumentos :

cd "$Foo"

Se você não citar $Foo , o comando cd verá dois (ou mais) argumentos, já que espaço em branco por padrão separa argumentos . No seu caso específico, você passaria /media/foo/can e haz/bar separadamente, já que o shell os divide no espaço. As variáveis de cotação dupla são um bom hábito para se desenvolver e você economizará em muitos casos em que o espaço em branco está envolvido.

Se você quiser uma maneira realmente feia de conseguir isso sem aspas, sobrescreva seu cd incorporado assim:

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

Isso funcionará se o caminho contiver espaços, pois $* conterá os argumentos individuais ( /media/foo/can e haz/bar ), separados pelo primeiro caractere IFS (geralmente um espaço) e, em seguida, você os colará juntamente com as aspas duplas.

No entanto, nunca é uma boa ideia substituir os builtins dessa forma.

    
por 06.07.2013 / 20:17
2

Como disse @slhck, a maneira correta de fazer isso é colocar aspas duplas em torno da referência da variável (por exemplo, cd "$Foo" ). A razão para isso é a ordem em que o shell analisa vários aspectos da linha de comando: primeiro procura por aspas e escapa (e as remove conforme aplica seus efeitos), então substitui as referências de variáveis pelos seus valores (por exemplo, $Foo - > /media/foo/can haz/bar ), volta pelos valores substituídos e aplica a expansão curinga ( *.txt - > a.txt b.txt etc) e a divisão de palavras ( /media/foo/can haz/bar - > "/ media / foo / can" " haz / bar "), mas nunca volta atrás e procura por aspas e / ou fugas nos valores das variáveis. Como resultado, inserir cotações e / ou escapes no valor de uma variável não nada é nem um pouco útil ; quando fazem parte da linha de comando, é tarde demais para que eles tenham o efeito desejado. Eu só conheço três maneiras de evitar a divisão de palavras no valor expandido:

  1. Aspas duplas na referência da variável. Não é tão conveniente, mas é um requisito da sintaxe padrão do shell.
  2. Altere o valor do IFS (a lista de caracteres usados para dividir palavras em variáveis expandidas). Em seguida, observe como todos os scripts que dependem do comportamento de divisão de palavras padrão quebram de forma estranha. Por favor não faça isso. Sério.
  3. Mude para um shell que não faça a divisão de palavras em variáveis expandidas: zsh. Você terá que se acostumar com suas outras diferenças do bash, mas se você realmente quer isso, é o melhor caminho a percorrer. Eu não uso eu mesmo, mas aqueles que parecem gostar muito ...
por 06.07.2013 / 23:32