我的构建脚本中有以下代码:
if [ -z "$1" ]; then
make -j10 $1 2>&1 | tee log.txt && notify-send -u critical -t 7 "BUILD DONE"
else
make -j10 $1 2>&1 | tee log.txt | grep -i --color "Error" && notify-send -u critical -t 7 "BUILD DONE"
fi 我试着优化它:
local GREP=""
[[ ! -z "$1" ]] && GREP="| grep -i --color Error" && echo "Grepping for ERRORS"
make -j10 $1 2>&1 | tee log.txt "$GREP" && notify-send -u critical -t 7 "BUILD DONE"但是,如果$1不是空的,则在make行中抛出错误。我只是不知道如何使用grep管道通过变量传递命令。
发布于 2014-05-20 04:41:26
正如其他人已经指出的那样,通常情况下,不能期望变量中的命令工作。这是个常见问题。
您可以做的是有条件地执行命令。例如,就像这样:
( make -j10 $1 2>&1 && notify-send -u critical -t 7 "BUILD DONE" ) |
tee log.txt |
if [ -z "$1" ]; then
grep -i --color "Error"
else
cat
fi这有一个额外的意想不到的好处,即notify-send实际上取决于make的退出代码(这可能是您想要的),而不是tee (除非磁盘或其他东西用完,否则我预计会成功)。
(或者,无论成功状态如何,如果您想要通知,请将&&更改为; --我认为这可能更有意义。)
这是cat的一种罕见的有用的用法(尽管我仍然感觉到了尝试摆脱它的冲动!)
发布于 2014-05-19 11:19:50
发布于 2014-05-19 13:10:22
正如在@10b0答案中提到的,|不会像您希望的那样被解释。
如果你想减少重复,你可以这样做:
if [ $(make -j10 "$1" 2>&1 > log.txt) ]; then
[ "$1" ] && grep -i --color "error" log.txt
notify-send -u critical -t 7 "BUILD DONE"
fi测试的内部对于两个分支都是通用的。而不是使用tee,以便输出可以管道化,您可以只是间接输出到log.txt。如果"$1"不是空的,则对log.txt中的任何错误进行grep。无论哪种方式,做notify-send。
https://stackoverflow.com/questions/23735891
复制相似问题