我正在尝试确定某个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 ...