【问题标题】:Is it possible to get the segment number in an xargs invocation是否可以在 xargs 调用中获取段号
【发布时间】:2010-12-20 22:41:14
【问题描述】:

Xargs 可用于将标准输入的内容切割成可管理的片段,并在每个片段上调用命令。但是有可能知道它是哪一块吗?举个例子:

序列 1 10 | xargs -P 2 -n 2 我的命令

会打电话

mycommand 1 2 &
mycommand 3 4 &
mycommand 5 6 &
mycommand 7 8 &
mycommand 9 10 &

但我想在我的“mycommand”脚本中知道

mycommand 1 2

正在处理第一个片段/片段,依此类推。是否可以访问该信息?

附言在上面的简单示例中,我只需查看数字即可判断。但是对于任意列表,如何在不实际在输入流中注入片段#的情况下访问信息?

【问题讨论】:

    标签: xargs


    【解决方案1】:

    我只看到如果您更改输入并添加序列号,您可以这样做:

    seq 1 10 | perl -ne '$. % 2 and print (($.+1)/2,"\n"); print' | xargs -n3 ...
    

    不清楚为什么需要这个,但如果你的最终目标是保持输出与输入的顺序相同,那么使用 GNU Parallel 可能更容易:

    seq 1 10 | parallel -j+0 -n2 -k mycommand 
    

    观看 GNU Parallel 的介绍视频以了解更多信息:http://www.youtube.com/watch?v=OpaiGYxkSuQ

    自 20101113 版以来,GNU Parallel 具有 $PARALLEL_SEQ,它被设置为命令的序列号:

    seq 1 10 | parallel -j+0 -n2 -k mycommand \$PARALLEL_SEQ
    

    这可能正是您正在寻找的。​​p>

    【讨论】:

    • 谢谢。我已经指出在将序列输入 xargs 之前注入段 id 的可能性。由于 xargs 和“injecter”都需要知道 split_param,因此最好从导出的环境变量中读取它。我只是想要一个快速而肮脏的嵌套并行器。知道 segment_id 将允许我标记每个 xargs 段生成的输出文件。但我认为 Gnu Parallel 是正确的方法。我一直在避免它,因为我害怕 perl 语法:)
    • 观看视频,您会发现您无需了解任何有关 perl 的知识即可使用 GNU Parallel。如果您知道如何使用 xargs,那么您已经知道如何使用 GNU Parallel。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 2019-10-25
    • 2013-06-16
    • 2016-08-05
    • 2020-04-10
    相关资源
    最近更新 更多