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 -v
forがsomeuser
返され、v9.4.0
コマンドがどのユーザーにもインストールされているバージョンをlocate
見つけられず、再インストールしたにもかかわらず、同じエラーが発生します。次のコマンドが有効です。参考にしてくださいv8
node
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;
私はnvm use v9.5.0
それなしでまだ動作していることを一度テストしました。次は剥がしたのにsource ~/.nvm/nvm.sh;
また壊れました。だから明らかにそれを調達して見る必要なしにそれを得る方法はありませんnvm
。shell-scripts
env
npm run build
nvm
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 -i
PATH
フルパスを指定しない場合は、コマンドを検索するために使用される変数を含む環境をクリーンアップします。したがって、を使用するときは、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
です。$TERM
LC_ALL=C