GNU Parallel中--nonall与--onall及--delay交互问题咨询
GNU Parallel --nonall/--onall 区别及与--delay的交互问题
1. --nonall 与 --onall 的核心区别
二者的差异核心在于是否处理命令中的占位符,以及对重复输入的执行逻辑:
- --onall:针对每一个输入项独立执行命令,若命令包含占位符(如
{}),会将占位符替换为对应输入项;即使输入项重复,也会严格执行对应次数。 - --nonall:强制忽略命令中的所有占位符,直接执行原始命令;当命令无占位符时,针对远程主机场景会自动对重复输入去重(本地未指定
-S时可能仍重复执行,但核心逻辑是不做占位符替换)。
你测试的echo "1"不含占位符,所以两种选项都会对每个输入项执行一次命令,结果自然一致。换成带占位符的命令就能看到差异:
# --onall替换占位符,输出a、a、a parallel --onall --jobs 1 echo {} ::: a a a # --nonall忽略占位符,输出{}、{}、{} parallel --nonall --jobs 1 echo {} ::: a a a
2. --delay 与 --nonall 无交互效果的原因
--delay的作用是在启动独立作业之间添加等待时长,但--nonall的执行逻辑会跳过作业的独立化处理:
- 使用
--nonall且命令不含占位符时,GNU Parallel会将所有输入项对应的执行视为同一类无差异作业,内部优化为批量启动,不会在它们之间插入--delay指定的等待时间。 - 而
--onall会将每个输入项对应的执行视为完全独立的作业(即使命令内容相同),因此会严格按照--delay设置,在每个作业启动前等待指定时长。
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

