想请教一个shell脚本的问题



以前没怎么写过,但是最近写了一些感觉很方便也很有意思,想请教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正常结束是程序的自发行为,这个行为并不来自于某种信号

标签: 脚本   发布日期:06-25