You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:27:04