首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过shell中的变量传递命令

通过shell中的变量传递命令
EN

Stack Overflow用户
提问于 2014-05-19 10:51:49
回答 3查看 96关注 0票数 0

我的构建脚本中有以下代码:

代码语言:javascript
复制
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  

我试着优化它:

代码语言:javascript
复制
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管道通过变量传递命令。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-20 04:41:26

正如其他人已经指出的那样,通常情况下,不能期望变量中的命令工作。这是个常见问题。

您可以做的是有条件地执行命令。例如,就像这样:

代码语言:javascript
复制
( 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的一种罕见的有用的用法(尽管我仍然感觉到了尝试摆脱它的冲动!)

票数 1
EN

Stack Overflow用户

发布于 2014-05-19 11:19:50

你不能把管道放进命令变量

代码语言:javascript
复制
$ foo='| cat'
$ echo bar $foo
bar | cat

链接文章解释了如何把这些事情做得很好。

票数 1
EN

Stack Overflow用户

发布于 2014-05-19 13:10:22

正如在@10b0答案中提到的,|不会像您希望的那样被解释。

如果你想减少重复,你可以这样做:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23735891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档