qual é o comando [-s “$ NVM_DIR / nvm.sh”] &&. "$ NVM_DIR / nvm.sh" fazendo

3

Encontrei o seguinte comando no arquivo .profile ao instalar o nó por meio do nvm:

[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" 

Eu quero saber qual é o objetivo de [] e && no seguinte comando.

Eu não encontrei essa sintaxe de comando antes, e quero entender, qual é o seguinte comando, e qual é a sintaxe chamada? Meu palpite é que está criando um link, estou certo?

EDITAR: nvm.sh não é um arquivo executável.

    
por souparno majumder 22.11.2015 / 15:01

2 respostas

11

O [ é uma construção de teste:

$ help [
[: [ arg... ]
    Evaluate conditional expression.

    This is a synonym for the "test" builtin, but the last argument must
    be a literal ']', to match the opening '['.

O -s é um dos testes disponíveis, ele retorna verdadeiro se o arquivo existir e não estiver vazio:

$ help test | grep -- -s
      -s FILE        True if file exists and is not empty.

O && é o operador AND . Ele executará o comando à direita somente se o comando à esquerda tiver sido bem-sucedido.

Finalmente, o . é o comando source que informa ao shell para avaliar qualquer código no arquivo originado dentro da mesma sessão do shell:

$ help .
.: . filename [arguments]
    Execute commands from a file in the current shell.

    Read and execute commands from FILENAME in the current shell.  The
    entries in $PATH are used to find the directory containing FILENAME.
    If any ARGUMENTS are supplied, they become the positional parameters
    when FILENAME is executed.

Então, o comando que você postou é o mesmo que:

## If the file exists and is not empty
if [ -s "$NVM_DIR/nvm.sh" ]; then
    ## Source it
    . "$NVM_DIR/nvm.sh"
fi
    
por 22.11.2015 / 15:08
6
cmd1 && cmd2

Executa cmd2 se e somente se cmd1 for bem-sucedido. Portanto, cmd1 && cmd2 será bem-sucedido se cmd1 e cmd2 forem bem-sucedidos, o que é a ideia de um operador "AND".

Aqui, cmd1 é o comando [ (usado para realizar testes) e cmd2 é o comando . (usado para dizer ao shell para avaliar o código contido em um determinado arquivo).

Para o comando [ -s file deve verificar se o arquivo file tem um tamanho diferente de zero (e retornar sucesso se for esse o caso).

Dessa forma, a linha de comando significa: interpreta o código no arquivo $NVM_DIR/nvm.sh se esse arquivo não estiver vazio .

Se estivesse vazio, isso não seria um problema, pois o comando . não faria nada. Esse teste ainda é útil, pois o comando [ também retornará falso se o arquivo não existir. Em shells do tipo Bourne (não bash , a menos que no modo de conformidade POSIX), fazer . a-file-that-does-not-exist faria com que o shell fosse encerrado (e mesmo em bash isso causaria uma mensagem de erro a ser exibida).

Portanto, se não houver garantia de que esse arquivo exista (e não há problema em fazê-lo), é uma boa ideia verificar isso antes, e [ -s file ] é uma maneira de fazer isso. Também tem o benefício de pular o comando . se o arquivo estiver vazio.

Observe que [ -s file ] também retornará verdadeiro / sucesso se file não for vazio e não for um arquivo regular (como um diretório) o que também causaria o comando . para falhar. Outro método poderia ter sido [ -f file ] , que testa que file existe e é um arquivo regular (ou link simbólico para arquivo regular), embora isso signifique que não é possível usar arquivos não regulares (como fifos) por mais tempo, e pode-se argumentar que produzir uma mensagem de erro se o arquivo for um diretório seria preferível, pois seria claramente um caso patológico.

Outra abordagem poderia ser [ -r file ] para verificar se o arquivo existe e é legível. Mas, novamente, se não for, você provavelmente preferiria uma mensagem de erro para falar sobre o problema.

Há também [ -e file ] para verificar apenas se o arquivo existe (independentemente de estar vazio, regular, legível ou não).

    
por 22.11.2015 / 15:05