以前没怎么写过,但是最近写了一些感觉很方便也很有意思,想请教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-get2>&1 | grep "ffmpeg.*-y.*-re.*-i" |head -n1 |
可不可以不触发sigpipe
不行的话
strace -f -etrace=execve you-get2>&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-get2>&1 | grep "ffmpeg.*-y.*-re.*-i"`
if [[ "$sbc" == "" ]];then 指令;fi
不追求性能的话 还要啥自行车啊
编辑
read -N 1 <<< `strace -f -etrace=execve you-get2>&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-get2>&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正常结束是程序的自发行为,这个行为并不来自于某种信号