Script Bash não manipula corretamente os comandos do npm

0

Eu tenho um script que executa alguns comandos git e npm com base em um usuário como

#!/bin/sh
/bin/su someuser -c "
cd /opt/app1/;
env -i git remote update;
env -i git pull origin dev;
cd /opt/app1/client/;
npm run build;
"

Os comandos git são executados corretamente. O comando npm é executado e constrói os arquivos, mas gera muitos erros sobre

Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 8.x

Found bindings for the following environments:
  - Linux 64-bit with Node.js 9.x

This usually happens because your environment has changed since running 'npm install'.
Run 'npm rebuild node-sass --force' to build the binding for your current environment.

Se eu executar npm run build como o usuário do terminal, tudo será criado. Eu até tentei env -i npm run build no script e isso diz apenas env: ‘npm’: No such file or directory . Então eu tentei env -i /usr/local/bin/npm run build e estranhamente que retornou /usr/bin/env: 'node': No such file or directory .

Acredito que o user -c me configuraria com todos env, como o usuário estava logado e que env -i me forneceria env sem o pai.

também tentou:

#!/bin/sh
/bin/su someuser - -c "
cd /opt/app1/;
git remote update;
git pull origin dev;
cd /opt/app1/client/;
npm run build;
"

Essa última tentativa retorna como primeiro: os comandos git funcionam, o build gera erros sobre o sass e o ambiente como se algo fosse diferente de quando eu executo o comando como o usuário do terminal.

Alguma idéia de por que este comando não está funcionando corretamente?

    
por jtlindsey 22.02.2018 / 05:00

2 respostas

1

env -i limpa o ambiente, e isso inclui a variável PATH , que é usada para procurar comandos se você não fornecer o caminho completo. Portanto, com env -i , você precisa especificar o caminho completo para os comandos que estão sendo chamados. Com npm , o que provavelmente acontece é que npm em si é um script que tem #! /usr/bin/env node como shebang, portanto, a procura pelo comando node falha.

Se você precisar limpar o ambiente, tente uma das seguintes opções:

  • sudo -iu someuser sh -c "...."
  • su someuser - -c "...." (esses dois comandos iniciam shells de login com alguma limpeza do ambiente)
  • ou, com env , retém algumas variáveis de ambiente, como o comando% service do Ubuntu:

    $ grep env $(command -v service) -m1
    out=$(env -i LANG="$LANG" LANGUAGE="$LANGUAGE" LC_CTYPE="$LC_CTYPE" LC_NUMERIC="$LC_NUMERIC" LC_TIME="$LC_TIME" LC_COLLATE="$LC_COLLATE" LC_MONETARY="$LC_MONETARY" LC_MESSAGES="$LC_MESSAGES" LC_PAPER="$LC_PAPER" LC_NAME="$LC_NAME" LC_ADDRESS="$LC_ADDRESS" LC_TELEPHONE="$LC_TELEPHONE" LC_MEASUREMENT="$LC_MEASUREMENT" LC_IDENTIFICATION="$LC_IDENTIFICATION" LC_ALL="$LC_ALL" PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" status 2>&1)
    

    Você provavelmente não precisa de todos, mas mantenha $PATH , $TERM e talvez defina LC_ALL=C .

por 22.02.2018 / 05:27
1

Por sugestão de Per Olorin de olhar para o erro do nó, explorei mais isso. Apesar do fato de que node -v para someuser estava retornando v9.4.0 e o comando locate não encontrando nenhuma v8 instalada para qualquer usuário e tendo reinstalado node , eu ainda estava recebendo o mesmo erro . O seguinte comando funciona. Observe o source ~/.nvm/nvm.sh;

#!/bin/sh  
/bin/su tstapps -c "
cd /opt/app1/;
git remote update;
git pull origin dev;
cd /opt/app1/client/;
source ~/.nvm/nvm.sh;
npm run build;

Em um ponto, eu tinha nvm use v9.5.0 e, em seguida, testei ainda funciona sem ele. Em seguida, removi source ~/.nvm/nvm.sh; e foi quebrado novamente. Portanto, aparentemente, o nvm não está disponível em shell-scripts env sem fazer o sourcing e o npm run build precisa ver nvm .

Problema estranho e parece que alguns usuários tiveram problemas semelhantes ao usar nvm recursos em bash com base em este tópico . Ainda não tenho certeza de onde estava obtendo o v8 . A menos que estivesse recebendo v8 do diretório include/node de v9 instalações. Exemplo:

/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-platform.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-profiler.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-testing.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-util.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-value-serializer-version.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-version-string.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8-version.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8.h
/home/someuser/.nvm/versions/node/v9.5.0/include/node/v8config.h
    
por 22.02.2018 / 07:48