Qual é a maneira correta de alterar a variável ambiental 'PATH'?

3

Quando se trata de alterar a variável de ambiente PATH (digamos, em "~ / .bashrc"), vi algumas maneiras diferentes de fazer isso:

PATH=$PATH:/new/path
PATH="$PATH:/new/path"
export PATH = $PATH:/new/path
export PATH = ${PATH}:/new/path
setenv PATH $PATH:/new/path

Quais são os { } para? Quando são necessários " " ? Quando usar export ou setenv ? Btw, meu Ubuntu 14.04 não tem uma entrada manual para export , mas tem um para setenv . Por quê?

    
por Rodrigo 19.10.2015 / 23:51

1 resposta

4
  

Quando se trata de alterar a variável de ambiente PATH (digamos, em "~ / .bashrc"), vi algumas maneiras diferentes de fazer isso

Algumas delas são formas válidas de definir $PATH , mas algumas não são formas válidas de definir $PATH ; a maioria tem a mesma captura e algumas diferem em seu escopo;

Falando da sintaxe (em shells compatíveis com Bash);

  • PATH=$PATH:/new/path : está ok, mas você precisará escapar de espaços em "/ new / path", se houver;
  • PATH="$PATH:/new/path" : está ok, e você não precisará escapar de espaços em "/ new / path", se houver;
  • export PATH = $PATH:/new/path : não está ok, já que você não pode ter espaços antes / depois de um operador de atribuição (e você precisaria escapar de espaços em "/ new / path");
  • export PATH = ${PATH}:/new/path : o mesmo que export PATH = $PATH:/new/path ;
  • setenv PATH $PATH:/new/path : setenv é csh integrado; deve ser o mesmo que PATH=$PATH:/new/path ;

As aspas simples / duplas impedem que o Bash se destaque em espaços em branco; Aspas simples impedem que o Bash execute expansões de parâmetros, substituições de comandos ou expansões aritméticas, forçando Bash a interpretar literalmente a string incluída; aspas duplas não evitam que Bash realize expansões de parâmetros, substituições de comandos ou expansões aritméticas, e no segundo caso elas são necessárias para permitir uma expansão de parâmetros em $PATH ;

Chaves são necessárias caso o caractere após uma variável seja um caractere válido para um nome de variável, mas : não é, então no quarto caso elas não são realmente necessárias;

Falando das diferenças entre var=value , export var=value e setenv var value ;

  • var=value define o valor de $var no shell atual; shells / processos bifurcados não herdarão a variável nem seu valor;
  • export var=value define o valor de $var no ambiente atual; shells / processos bifurcados herdarão a variável e seu valor;
  • setenv PATH $PATH:/new/path : o mesmo que export var=value ;
$ foo=bar
$ bash
$ echo $foo

$ exit
exit
$ export foo=bar
$ bash
$ echo $foo
bar
  

A propósito, meu Ubuntu 14.04 não possui uma entrada manual para export , mas tem um para setenv . Por quê?

Se você digitar man setenv , obterá a saída de man 3 setenv , que é a entrada manual da função setenv() do "Linux Programmer's Manual"; Como dito anteriormente, não há comando setenv no Ubuntu nem integrado no Bash chamado setenv , embora haja um setenv embutido em csh ;

export em vez disso é um Bash embutido, e para obter informações sobre isso você terá que executar help export :

$ help export
export: export [-fn] [name[=value] ...] or export -p
    Set export attribute for shell variables.

    Marks each NAME for automatic export to the environment of subsequently
    executed commands.  If VALUE is supplied, assign VALUE before exporting.

    Options:
      -f    refer to shell functions
      -n    remove the export property from each NAME
      -p    display a list of all exported variables and functions

    An argument of '--' disables further option processing.

    Exit Status:
    Returns success unless an invalid option is given or NAME is invalid.
    
por kos 20.10.2015 / 00:33