Bash、grep - 为什么带有插入符号的命令在子 shell 中不起作用?

Bash、grep - 为什么带有插入符号的命令在子 shell 中不起作用?

我正在尝试确定某个git add操作是否创建了任何预期的修改,并且以下内容在交互式 shell 中有效

$ BASE_DIR=foo/bar/baz
$ git add "${BASE_DIR}"
$ git status --porcelain
M  foo/bar/baz/a.txt
M  foo/bar/baz/b.txt
$
$ git status --porcelain | grep "^M  ${BASE_DIR}"
$ echo $?
0

我想把它写在脚本中

if $(git status --porcelain | grep "^M  ${BASE_DIR}"); then
  git commit -m "changes added"
  git push
fi

但是,当将命令移动到子 shell 时,它会失败:

$ if $(git status --porcelain | grep "^M  ${BASE_DIR}"); then echo true; fi
M: command not found

子 shell 中的插入符号有什么特别之处?

答案1

(发布只是因为我做了所有的工作来写问题然后注意到我的错误)

字符串中的插入符号没有什么特别的。该命令$(git status --porcelain | grep "^M ${BASE_DIR}")正在正确运行给定的测试并且捕获子 shell 的输出。这个输出(看起来像“M foo/bar/baz/a.txt”)是被处决当作为 的参数给出时if,解释错误“M:未找到命令”。

要修复此问题,请删除括号并丢弃输出。返回值是管道中最后一个命令的值。

if git status --porcelain | grep --quiet "^M  ${BASE_DIR}"; then ...

相关内容