您现在的位置 > 首页>知识问答 >

想请教一个shell脚本的问题

点击图片查看下一页
查看原图
更新:06-25     编辑:     来源:    


  • 以前没怎么写过,但是最近写了一些感觉很方便也很有意思,想请教linux达人们一个问题
    有下面这么一行管道

    末尾尖括号内的指令应该在grep产生第一个匹配的时候开始执行一个脚本(不多次执行,无匹配结果则不执行),并且在strace结束的时候,这个脚本也结束
    这个脚本显然是要和管道的前几段异步执行,而且<>里的指令不能让前面两段SIGPIPE。
    假设用的是bash,脚本是个死循环,没人管它就会一直跑,不访问文件系统,也没有trap。
    尽量不用可能需要额外安装的命令(比如ifne这种),能不能在一趟管道内实现?

    是实际遇到的问题,纯好奇,不是出题


    网友评论:


    没看懂什么叫不能让前面两段sigpipe 什么叫在一趟管道内实现
    shell 太可怕了 放过自己吧


    一条命令是强要求吗?
    bash本身支持管道文件的啊。mkfifio
    。或者用tail 取最后一行(假定最后一行是最新插入)
    —— 来自 Xiaomi Redmi 4, Android 6.0.1上的 v2.1.2
    不知道用

    strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i" |head -n1 |

    可不可以不触发sigpipe

    不行的话

    strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i" | awk ’{ if (NR==1) { system("your command"); }}"

    试试

    不算强制要求,但是我觉得尽量简洁(没有显式的作业控制,非命名管道)吧,能让脚本自己SIGPIPE结束是最好的了,如果可以的话

    条件执行这一点我感觉做法应该就是: ... | read -N 1 && <script>,不用&&的话<script>应该怎么都会执行
    FIFO是个办法,但我也没想好怎么弄
    mkfifo p
    strace ... | grep ... < p &
    read -N 1 && script.sh > p 这样吗?

    第一个的instruction会无条件执行啊,哪怕是在等管道它还是执行了啊

    第二个。。。就是觉得有点小题大做,然后该怎么随strace结束它呢
    看不懂,建议换py

    没明白 你不是就要无条件执行吗 你是想什么情况下不执行?

    grep没有匹配到结果就不执行呀
    题外话,什么时候该用py什么时候该用shell


    abc=`strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i"`

    if [[ "$sbc" == "" ]];then 指令;fi


    不追求性能的话 还要啥自行车啊


    编辑


    read -N 1 <<< `strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i"` && 指令

    不会写 shell 的时候就用 python 吧
    strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i" | (read -N 1 && 指令)



    strace -f -etrace=execve you-get 2>&1 | grep "ffmpeg.*-y.*-re.*-i" | (read -N 1 && 指令)

    这个应该满足strace结束后脚本结束吧
    为什么一定要用pipe呢。。
    早日拥抱Python 早日获得新生

    组里的人看不懂shell的时候用py
    生产环境不让装py的时候用shell
    其余情况看心情

    就是纯好奇好玩啊...
    这应该比什么perl one-liner简单吧,我猜


    pipe没法传递exit code(指没匹配的情况),不太适合你这个需求
    不过可以在最后一步下文章,写个专门的脚本应该还是可以实现的
    如果你的指令能通过arg传参的话可以试试xargs
    xargs -L 1,不过这样就会多次执行脚本了,不过我觉得这样比较好写。。
    @yenvy 请问最后你用了什么方法 我18楼提供的方法行不行

    除非是为了方便,原则上任何时候都应该少用shell
    人生苦短 我用python

    我就用的后台执行加手动kill啊。。这不是想不出来才出来问一个么。。

    18L那个不行,试图写broken pipe才会退出,读取端遇到EOF正常结束是程序的自发行为,这个行为并不来自于某种信号

相关推荐

精彩图集

一品图片网部分图片资源收集于互联网,如果侵犯了您的版权请来信告知,我们会及时处理和回复,邮件地址:
© 2021 一品图片网 版权所有 苏ICP备150288886号 | sitemap | 图片大全