我有一个包含以下内容的 bash 脚本 (test.sh
):
#!/bin/bash
npm test |& grep -v '[HPM]'
if [[ $? -ne 0 ]]; then
...
尝试在本地运行此脚本时出现此错误:
test.sh: line 3: syntax error near unexpected token `&'
test.sh: line 3: `npm test |& grep -v '[HPM]''
答案 0 :(得分:1)
|&
语法使用非标准令牌,bash
但并非所有 shell 都能识别该令牌。这种构造通常称为 bashism
。如果您的 shell 无意中被调用为非 bash shell,那么这是一个语法错误。您可以轻松地为此使用标准化的构造:
npm test 2>&1 | grep -v '\[HPM\]'
请注意,这是不寻常的。捕获 npm 的 stderr 似乎很奇怪,但也许您确实想检查 grep
是否打印任何行。确实没有必要显式检查 $?
,您的代码通常会这样编写:
if ! npm test 2>&1 | grep -v '\[HPM\]'; then
: grep failed. Do something
fi
但是,这似乎很奇怪。如果 grep -v
不打印任何文本行,则会“失败”,否则会成功。也许您希望 $?
在原始代码中包含 npm
的退出状态,但事实并非如此。如果 $?
打印任何文本,grep
将为零,否则为非零。