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 queexport PATH = $PATH:/new/path
; -
setenv PATH $PATH:/new/path
:setenv
écsh
integrado; deve ser o mesmo quePATH=$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 queexport 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 parasetenv
. 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.