V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
YenvY
V2EX  ›  问与答

如何在管道输出内容后才执行后续的命令

  •  
  •   YenvY · 2019-02-05 08:41:34 +08:00 · 1761 次点击
    这是一个创建于 1906 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下模式的一行命令

    <command1>| grep blahblah | <command2>

    grep 匹配到结果则执行,如果 grep 结束前没匹配到结果则 C2 不执行

    比如用 strace -etrace=open 去跟踪特定文件的创建,在该文件创建时执行一个命令。

    google 出一个方法是用 xargs -r,但是在 grep 出的结果有一堆空格的情况下要保证 C2 只执行一次还挺麻烦的,毕竟管道过来的内容只是当作一个信号来用,其内容没什么意义。感觉这个 C2 应该是必须要通过类似 xargs 这样的命令间接调用,想知道有没有更好的方法?

    第 1 条附言  ·  2019-02-05 11:19:13 +08:00
    趴在地上想了一下,最后一节改成 read -n1 && <C2>是不是就可以了...
    exip
        1
    exip  
       2019-02-05 09:03:27 +08:00 via Android
    你需要的不是|需要&
    huskar
        2
    huskar  
       2019-02-05 10:45:06 +08:00 via Android
    if cmd1|grep xxx
    then
    cmd2
    fi
    YenvY
        3
    YenvY  
    OP
       2019-02-05 11:13:54 +08:00
    @huskar
    怪我没描述清楚。我想要的效果是如果在 C1 结束前 grep 匹配出了结果,C2 就能执行,而不必等到 C1 结束
    至少 C2 和管道的其他部分是并发执行的。
    YenvY
        4
    YenvY  
    OP
       2019-02-05 11:14:22 +08:00
    @exip
    没看懂,能详细说说吗
    huskar
        5
    huskar  
       2019-02-05 11:50:30 +08:00 via Android
    @YenvY 写 Python 脚本吧
    pkookp8
        6
    pkookp8  
       2019-02-05 12:47:34 +08:00 via Android
    a=`cmd1 | grep` &
    while true;do if $a;then cmd2;fi;done
    pkookp8
        7
    pkookp8  
       2019-02-05 12:48:01 +08:00 via Android
    @pkookp8 忽略,脑抽了
    Beebird
        8
    Beebird  
       2019-02-05 14:16:59 +08:00 via Android
    C1 | grep xxxxx && C2
    若 C1 | grep xxxxx 的 return code 不为 0,则不执行 C2
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3330 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:58 · PVG 20:58 · LAX 05:58 · JFK 08:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.