Como o segundo else é invocado aqui depois do comando cmp?

4

Eu realmente não entendo como funciona a segunda cláusula || . Eu entendo que se os pacotes forem diferentes, o rm -r node_modules será executado. No entanto, não entendo como funciona o segundo ||

cmp package.0.json node_modules/package.1.json || { rm -r node_modules || :; npm install; cp package.json node_modules/; }
    
por Karl Morrison 03.08.2017 / 09:50

2 respostas

2

O fragmento cmdA || cmdB significa "Executar cmdA e, se falhar (sai com um código de saída diferente de 0), execute cmdB ".

De link : o cólon : no bash é um comando que não faz nada.

Assim, o fragmento rm -r node_modules || :; ... pode ser interpretado como:

  1. Executar rm -r node_modules .
  2. Se falhar (porque o diretório node_modules file não existe ou não temos permissões), não faça nada (ignore o erro)
  3. Execute o restante da linha.

Esta é uma forma de ignorar erros, porque neste caso são esperados erros. Especificamente para rm , dessa forma é mais seguro que o -f sinalizador porque não força a remoção de arquivos rm normalmente se recusaria a excluir.

    
por 03.08.2017 / 10:03
0

|| avalia o lado direito apenas se o status de saída do lado esquerdo for diferente de zero (geralmente é quando ele falha). Então, de acordo com isso, os passos são:

  1. cmp package.0.json node_modules/package.1.json
  2. Apenas se o comando anterior falhar, execute as próximas etapas
  3. Executar rm -r node_modules
  4. Se a etapa 3 falhar, não faça nada ( : é como um comando no-op )
  5. Executar npm install
  6. Executar cp package.json node_modules/
por 03.08.2017 / 10:08

Tags