Recentemente, notei o seguinte no meu perfil do cygwin, mais precisamente:
/usr/local/bin:/usr/bin${PATH:+:${PATH}}
O que isso significa? Por que não é apenas $ PATH? Isso é 'se $ PATH existir, adicione: $ PATH'? Meu objetivo é trocar a ordem e colocar os caminhos cygwin atrás do caminho do Windows. No passado eu teria
$PATH:/usr/local/bin:/usr/bin
mas isso me confunde. Talvez eu devesse estar fazendo
PATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
acrescentar o: no final do $ PATH?
shell
path
variable-substitution
tofutim
fonte
fonte
Respostas:
O
:+
é uma forma de expansão de parâmetro :Em outras palavras, se a variável
$var
for definida,echo ${var:+foo}
será impressafoo
e, se não for, será impressa a sequência vazia.O segundo
:
não é nada de especial. É o caractere usado como um separador na lista de diretórios em$PATH
. Então,PATH="/usr/local/bin:/usr/bin${PATH:+:${PATH}}"
é uma maneira abreviada de escrever:É apenas um truque inteligente para evitar adicionar um extra
:
quando$PATH
não estiver definido. Por exemplo:Mas se
PATH
não estiver definido:A,
:
por si só, adiciona o diretório atual ao arquivo$PATH
. O usoPATH="/new/dir${PATH:+:$PATH}"
evita isso. Então, com certeza, você pode usarPATH="${PATH:+${PATH}:}/usr/local/bin:/usr/bin"
se quiser, ouPATH="$PATH:/usr/local/bin:/usr/bin"
se preferir. A única diferença é que o primeiro pode adicionar um extra:
, adicionando assim o seu diretório atual ao seu$PATH
.fonte
:
prejudicial?$PATH
(veja a resposta de @ AndyB ). Isso pode ser um risco de segurança em algumas situações (digamos que um invasor tenha carregado um script destrutivo no diretório atual e o tenha nomeadols
ou algo assim), mas na maioria dos casos, você realmente não se importa. De fato, alguns sistemas adicionam o diretório atual aoPATH
padrão de qualquer maneira.csh
com isso como uma matriz.Você está correto, isso significa 'se $ PATH existe - e não é nulo - adicione: $ PATH'.
Você precisa verificar se $ PATH existe porque não deseja adicionar os dois pontos iniciais (ou à direita) se $ PATH estiver indefinido. Um nome de diretório de tamanho zero (nulo) no caminho, como em
:/usr/local/bin:/usr/bin
, ou/usr/local/bin:/usr/bin:
, ou/usr/local/bin::/usr/bin
, significa pesquisar no diretório atual .Extraído de
man bash
:Provavelmente não é isso que você quer fazer.
As duas linhas a seguir fazem a mesma coisa:
fonte