如何让Bash导出函数可在搭配sem命令的管道中正常使用
sem搭配Bash导出函数与管道的解决方案
核心问题原因
sem默认使用/bin/sh执行任务,而你通过export -f导出的是Bash专属函数,sh环境无法识别Bash导出的函数,导致管道调用addurls时报命令不存在错误。- 你循环中定义的
$feed变量没有传递到sem的子执行环境,techmeme函数无法读取到正确的feed地址,逻辑第一步就无法正常运行。 - 原有数组遍历写法
for feed in $feeds仅能读取数组第一个元素,不符合多feed遍历需求。
调整后的完整代码
file=/tmp/log export file addurls() { while read -r url; do echo "$url" echo "$url" >> "$file" done } export -f addurls # 改为接收参数传入feed地址,避免依赖全局变量 techmeme() { local feed="$1" xidel -s "$feed" --extract '//description' | ack '^<A HREF' | awk -F\" '{ print $2 }' \ | addurls } export -f techmeme feeds=( 'https://www.techmeme.com/feed.xml' 'https://www.memeorandum.com/feed.xml' 'https://mediagazer.com/feed.xml' ) # 正确遍历数组所有元素,指定用bash执行任务,同时传入feed参数 for feed in "${feeds[@]}"; do sem -j 3 --shell /bin/bash "techmeme '$feed'" done sem --wait
关键修改说明
- 给
sem添加--shell /bin/bash参数,强制使用Bash执行任务,即可识别Bash导出的自定义函数。 - 调整
techmeme函数为参数接收feed地址,调用时直接传入对应值,避免变量传递失效问题。 - 修正数组遍历写法为
for feed in "${feeds[@]}",可遍历所有feed元素。 - 并发数可根据需求调整
-j参数值,比如-j 3表示同时跑3个任务,比原有的-j 1串行执行效率更高。
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

