尝试管道输出时出现 Bash 错误:语法错误

时间:2021-04-09 15:44:38

标签: bash sh

我有一个包含以下内容的 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]''

1 个答案:

答案 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 将为零,否则为非零。

相关问题