Bashスクリプトはnpmコマンドを正しく処理しません。

Bashスクリプトはnpmコマンドを正しく処理しません。

git次のように、ユーザーに基づいていくつかのコマンドを実行するスクリプトがあります。npm

#!/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;
"

コマンドがgit正しく実行されます。コマンドnpmが実行され、ファイルをビルドしますが、多くのエラーが発生します。

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.

npm run build端末でユーザーとして実行すると、すべてがうまく機能します。私もスクリプトenv -i npm run buildでそれを試しましたが、これが結果でしたenv: ‘npm’: No such file or directory。それでその時やってみたのにenv -i /usr/local/bin/npm run build変にまた出てきたんですよ/usr/bin/env: 'node': No such file or directory

私はこれがuser -cユーザーログインのようなすべての環境を設定し、親なしでenv -i私をきれいにすると思いました。env

また試しました:

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

最後の試みは最初と同じ結果を返します。 git コマンドが動作し、ビルドは端末からユーザーとしてコマンドを実行すると、他のように sass と環境にエラーが発生します。

このコマンドが正しく機能しない理由をご存知ですか?

答え1

ノードエラーを調べるOlorinの提案に従って、私はこの問題をもう少し調べました。node -vforがsomeuser返され、v9.4.0コマンドがどのユーザーにもインストールされているバージョンをlocate見つけられず、再インストールしたにもかかわらず、同じエラーが発生します。次のコマンドが有効です。参考にしてくださいv8nodesource ~/.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;

私はnvm use v9.5.0それなしでまだ動作していることを一度テストしました。次は剥がしたのにsource ~/.nvm/nvm.sh;また壊れました。だから明らかにそれを調達して見る必要なしにそれを得る方法はありませんnvmshell-scripts envnpm run buildnvm

nvm奇妙な問題です。一部のユーザーが以下に基づいてリソースを使用すると同様の問題が発生しているようです。bashこのスレッド。まだそれがどこからv8来たのかわからない。v8インストールディレクトリからinclude/nodeインポートしない限りv9。例:

/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

答え2

env -iPATHフルパスを指定しない場合は、コマンドを検索するために使用される変数を含む環境をクリーンアップします。したがって、を使用するときは、env -i呼び出されるコマンドのフルパスを指定する必要があります。npm何が起こるのかは、それnpm自体がshebangを含むスクリプトであるため、#! /usr/bin/env nodeコマンド検索がnode失敗することです。

環境を整理する必要がある場合は、次のいずれかの方法を試してください。

  • sudo -iu someuser sh -c "...."
  • su someuser - -c "...."(どちらのコマンドもログインシェルを起動し、環境を一部クリーンアップします。)
  • envあるいは、 Ubuntuコマンドなどservice、いくつかの環境変数を使用して保存します。

    $ 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)
    

    これはすべて必要ではないかもしれませんが、それを維持または設定するだけ$PATHです。$TERMLC_ALL=C

関連情報