Comportamento do conjunto de variáveis de uma linha env [duplicado]

1

Se eu fizer isso:

SUMAN_DEBUG=foo echo $SUMAN_DEBUG

não recebo saída

mas se eu fizer isso:

SUMAN_DEBUG=foo && echo $SUMAN_DEBUG

então eu pego

"foo"

por que isso?

    
por Alexander Mills 11.12.2016 / 01:58

2 respostas

1

Na linha de comando, você precisa separar os comandos usando ; ou && . Espaço, não é apenas um delimitador para os comandos da CLI.

Com && , o segundo comando será executado se o primeiro comando sair com êxito (código de saída 0).

Com ; , o segundo comando será executado independentemente do status de saída do primeiro comando.

Teste:

# a1;echo hello
bash: a1: command not found
hello
# a1 && echo hello
bash: a1: command not found

Nos scripts, o primeiro comando e o segundo comando são separados por uma nova linha \n character, também reconhecida pelo bash.

    
por 11.12.2016 / 02:27
1

SUMAN_DEBUG=foo é uma atribuição de variável de ambiente local para uma variável local que existe apenas para o comando que ela prefacia. Em seu segundo caso, não há comando porque o && inicia uma lista de comandos onde, no seu caso, o primeiro comando é nulo (portanto a variável de ambiente não tem nenhum comando para afetar) e o segundo é executado, mas não possui ambiente variável definida para isso.

Você pode adicionar export à atribuição para que a variável se torne uma variável de ambiente global. Mas então persistiria depois que a lista de comandos estivesse completa.

Outra opção é colocar a lista de comandos inteira entre parênteses para executá-la em um subshell:

(export SUMAN_DEBUG=foo && echo $SUMAN_DEBUG)

Nesse caso, a variável de ambiente persistente seria definida em uma subshell e esse ambiente desapareceria quando a subshell concluísse seu trabalho).

Consulte o Bourne-again Shell Manual , a seção de listas e a seção sobre < um href="https://www.gnu.org/software/bash/manual/bash.html#Environment"> Ambiente para mais.

    
por 11.12.2016 / 07:03