AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 425809
Accepted
jtlindsey
jtlindsey
Asked: 2018-02-22 20:00:42 +0800 CST2018-02-22 20:00:42 +0800 CST 2018-02-22 20:00:42 +0800 CST

Bash 脚本未正确处理 npm 命令

  • 772

我有一个脚本可以运行一些基于用户的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 和环境的错误,就好像我从终端以用户身份运行命令时有所不同。

知道为什么这个命令不能正常工作吗?

bash shell-script
  • 2 2 个回答
  • 22020 Views

2 个回答

  • Voted
  1. Best Answer
    jtlindsey
    2018-02-22T22:48:52+08:002018-02-22T22:48:52+08:00

    根据 Olorin 关于查看节点错误的建议,我对此进行了更多探索。尽管node -vforsomeuser正在返回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 envnpm run buildnvm

    奇怪的问题,看起来有些用户在使用基于此线程nvm的资源时遇到了类似的问题。仍然不确定它是从哪里得到的。除非它是从安装目录中获取的。例子:bashv8v8include/nodev9

    /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
    
    • 3
  2. Olorin
    2018-02-22T20:27:56+08:002018-02-22T20:27:56+08:00

    env -i清理环境,其中包括PATH变量,如果您不提供完整路径,则该变量用于查找命令。因此,使用env -i,您需要指定被调用命令的完整路径。使用npm,可能发生的情况是它npm本身是一个脚本,具有#! /usr/bin/env node作为 shebang,因此node命令的查找失败。

    如果您需要清洁环境,请尝试以下任一方法:

    • sudo -iu someuser sh -c "...."
    • su someuser - -c "...."(这两个命令都会启动登录 shell,并对环境进行一些清理)
    • 或者,使用env,保留一些环境变量,就像 Ubuntuservice命令一样:

      $ 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,也许还有 set LC_ALL=C。

    • 1

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve