Qual é o significado de $ {GZIP_BINDIR - '/ bin'} no bash?

13

Alguém pode explicar o que esse comando significa?

PATH="${GZIP_BINDIR-'/bin'}:$PATH"; export PATH
Rashmi Narahari
fonte

Respostas:

19

${GZIP_BINDIR-'/bin'}é um bashpadrão de expansão de parâmetro. De man bash:

${parameter:-word}
              Use Default Values.  If parameter is unset or null, 
the expansion of word is substituted.  Otherwise, the  value  of parameter
is substituted.

Imediatamente antes desta porção, a página de manual (obrigado a @jwodder por notificar):

Omitting the colon results in a test only for a parameter that is unset.

Como diz a página de manual, ele definirá o valor padrão da variável GZIP_BINDIR. Se GZIP_BINDIRtiver um valor definido anteriormente (diferente de nulo, como você não está usando :), esse valor será usado, caso contrário, /binserá usado como o valor da variável GZIP_BINDIR.

Por outro lado, se você quiser testar também valores nulos, use este padrão (incluir :):

${GZIP_BINDIR:-'/bin'}

Depois disso, o $PATHserá expandido para os valores que estava mantendo antes. Então, se PATHanteriormente tinha:

/usr/sbin:/usr/bin

Agora você PATHserá (considerando que GZIP_BINDIRnão está definido):

/bin:/usr/sbin:/usr/bin

export PATHtornará isso PATHdisponível para todos os processos filhos.

heemail
fonte
" Eu acho que você perdeu um :em${GZIP_BINDIR-'/bin'} " Não necessariamente. ${parameter-word}também é válido, embora não pareça estar na página de manual.
nyuszika7h
@ nyuszika7h Yeah..i não sabia que before..strange porque não incluídos na manpage ..
heemayl
Na página de manual do bash no meu computador, o parágrafo logo acima da seção :-diz: "Ao não executar expansão de substring, usando os formulários documentados abaixo (por exemplo: :-), o bash testa um parâmetro não definido ou nulo. Omitindo os dois pontos resulta em um teste apenas para um parâmetro não
definido
Como nota lateral, você pode combinar a configuração de PATHe exportem um único comando da seguinte maneira:export PATH="${GZIP_BINDIR-'/bin'}:$PATH"
Paddy Landau
8

Realmente não há dois pontos antes do hífen dentro da expansão do parâmetro ${GZIP_BINDIR-'/bin'}?

Esse tipo de construção quase sempre é escrito com dois pontos, como ${GZIP_BINDIR:-'/bin'}significa "se $ GZIP_BINDIR for NULL ou não estiver definido, defina-o como '/ bin'"

No entanto, a sintaxe que você forneceu é válida, mas rara. ${GZIP_BINDIR-'/bin'}(sem dois pontos) significa "se $ GZIP_BINDIR não estiver definido, defina-o como '/ bin'". Se estiver definido (foi declarado), mas nada lhe for atribuído (por exemplo, é NULL), nada será inserido.

Pode haver um erro aqui, pois os dois pontos a seguir a construção variável (...} :$ PATH ...) vai ainda ser inserido se $ GZIP_BINDIR é conjunto, mas NULL. Como isso adicionaria dois pontos no início do $ PATH, fará com que o diretório atual seja pesquisado primeiro.

Isso é considerado pela maioria como um problema de segurança, pois facilita a execução de um programa malicioso com o mesmo nome dos comandos padrão, apenas colocando-o no diretório atual.

Para deixar $ PATH inalterado se $ GZIP_BINDIR estiver definido, mas NULL (vazio), a sintaxe correta seria ${GZIP_BINDIR-'/bin:'}$PATH; export PATH

Para deixar $ PATH inalterado se $ GZIP_BINDIR estiver desabilitado ou definido, mas for NULL, a sintaxe correta será ${GZIP_BINDIR:-'/bin:'}$PATH; export PATH

DocSalvager
fonte
2

Este comando atualiza a variável PATH.

A PATHé uma variável de ambiente que especifica um conjunto de diretórios onde os programas executáveis ​​estão localizados.

PATH="${GZIP_BINDIR-'/bin'}:$PATH";

Isso adiciona o valor de outra variável GZIP_BINDIRse sair para o PATH anterior, caso contrário, use / bin e adicione-o ao PATH

export PATH

export é usado para definir o PATH disponível para todos os processos e subshells filhos Leia isto para obter mais informações sobre

Você deve observar que isso não é estático e você o perderá assim que sair do shell.

Para tornar esta edição PATH permanente, você deve anexar essas linhas ao seu .bashrc

gedit .bashrc

e adicione a linha

export PATH="${GZIP_BINDIR-'/bin'}:$PATH"

então execute o comando

source .bashrc
Maythux
fonte
GZIP_BINDIR é a variável
Maythux 27/05
o que não está certo? Não, eu não fiz? o meu também foi
rebaixado
Por que voto negativo ?!
Maythux 27/05