Bash 如何检查npm脚本是否存在?

Bash 如何检查npm脚本是否存在?,bash,shell,npm,npm-run,Bash,Shell,Npm,Npm Run,我正在创建一个bash脚本,它在我的每个项目中运行,如果test脚本存在,则运行npm run test 我知道,如果我进入一个项目并运行npm run,它将为我提供可用脚本的列表,如下所示: Lifecycle scripts included in www: start node server.js test mocha --require @babel/register --require dotenv/config --watch-extensions js **

我正在创建一个bash脚本,它在我的每个项目中运行,如果
test
脚本存在,则运行
npm run test

我知道,如果我进入一个项目并运行
npm run
,它将为我提供可用脚本的列表,如下所示:

Lifecycle scripts included in www:
  start
    node server.js
  test
    mocha --require @babel/register --require dotenv/config --watch-extensions js **/*.test.js

available via `npm run-script`:
  dev
    node -r dotenv/config server.js
  dev:watch
    nodemon -r dotenv/config server.js
  build
    next build
但是,我不知道如何获取这些信息,看看
test
是否可用,然后运行它

这是我目前的代码:

#!/bin/bash

ROOT_PATH="$(cd "$(dirname "$0")" && pwd)"
BASE_PATH="${ROOT_PATH}/../.."

while read MYAPP; do # reads from a list of projects
  PROJECT="${MYAPP}"
  FOLDER="${BASE_PATH}/${PROJECT}"
  cd "$FOLDER"
  if [ check here if the command exists ]; then
    npm run test
    echo ""
  fi
done < "${ROOT_PATH}/../assets/apps-manifest"
#/bin/bash
ROOT_PATH=“$(cd“$(dirname“$0”)”&&pwd)”
BASE_PATH=“${ROOT_PATH}/./…”
阅读MYAPP时;do#从项目列表中读取
PROJECT=“${MYAPP}”
FOLDER=“${BASE\u PATH}/${PROJECT}”
cd“$文件夹”
如果[在此检查命令是否存在];然后
npm运行测试
回声“”
fi
完成<“${ROOT\u PATH}/。/资产/应用程序清单”
编辑: 正如Marie和James提到的,如果您只想在命令存在时运行该命令,npm有一个选项:

npm run test --if-present
通过这种方式,您可以使用一个通用脚本来处理多个项目(可能有或可能没有特定的任务),而不会有收到错误的风险

资料来源:

编辑

你可以做一个grep来检查单词测试:

npm run | grep -q test
如果npm运行中的结果包含单词test,则返回true

在脚本中,它将如下所示:

#!/bin/bash

ROOT_PATH="$(cd "$(dirname "$0")" && pwd)"
BASE_PATH="${ROOT_PATH}/../.."

while read MYAPP; do # reads from a list of projects
  PROJECT="${MYAPP}"
  FOLDER="${BASE_PATH}/${PROJECT}"
  cd "$FOLDER"
  if npm run | grep -q test; then
    npm run test
    echo ""
  fi
done < "${ROOT_PATH}/../assets/apps-manifest"
#/bin/bash
ROOT_PATH=“$(cd“$(dirname“$0”)”&&pwd)”
BASE_PATH=“${ROOT_PATH}/./…”
阅读MYAPP时;do#从项目列表中读取
PROJECT=“${MYAPP}”
FOLDER=“${BASE\u PATH}/${PROJECT}”
cd“$文件夹”
如果npm运行| grep-q测试;然后
npm运行测试
回声“”
fi
完成<“${ROOT\u PATH}/。/资产/应用程序清单”
如果test这个词有另一个意思,那就是一个问题
希望有帮助

正确的解决方案是使用if present标志:


npm运行测试——如果存在

为什么这是正确的解决方案?
--如果存在
做什么?请对此答案展开讨论。如果定义了--if present标志,则该标志将仅运行指定的脚本。因此,请在回答中澄清这一点。扩展它,让它成为一个真正伟大的答案。谢谢@James!!这个答案救了我:)这里有一个到npm文档的链接:我希望这也适用于yarnFYI:下面的答案(使用
npm运行测试-如果存在
)是一个更好的解决方案。我将添加您的建议@MarieHoeger,因为对于当前的用户案例,它确实是一个更好的解决方案,我仍然会留下我的其他解决方案,因为对于问题的确切描述(如何检查npm脚本是否存在?),我的解决方案可以在更多情况下使用,并可能帮助其他用户。太棒了,谢谢@Denis!我认为我的措辞也比我想的更直截了当。道歉!是我还是
--如果存在
解决方案。。。错了吗?不定义“测试”脚本,然后运行
npm测试
npm运行测试
npm运行脚本测试
等。使用和不使用
--is present
标志给出相同的结果:
>回显“错误:未指定测试”
错误:未指定测试
我在这里检查并获得相同的行为。。但它似乎是特定于“test”命令的,对于它工作的任何其他命令。我认为如果不定义一个测试脚本,就会有某种默认的测试脚本,所以它总是存在的(至少对于--if-present来说是如此),但是我无法在文档中找到任何支持它的东西