首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制gnu-parallel将替换字符串视为命令

强制gnu-parallel将替换字符串视为命令
EN

Stack Overflow用户
提问于 2019-01-18 04:22:02
回答 2查看 281关注 0票数 3

我希望在使用替换字符串(例如:{%})时,将一个包含命令列表的文件传递给gnu-parallel。

不幸的是,如果使用替换字符串,gnu-parallel会将文件中的命令解释为/bin/bash的参数。

这是我想要做的:

代码语言:javascript
复制
parallel -j 8 'CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txt

其中,commands.txt的内容是:

代码语言:javascript
复制
/path/to/binary -arg1 a -arg2 1.0
/path/to/binary -arg1 a -arg2 1.1
...
/path/to/binary -arg1 z -arg2 9.9

但是,这会引发以下错误:

代码语言:javascript
复制
/bin/bash: /path/to/binary -arg1 a -arg2 1.0: command not found

我希望GNU并行运行:

代码语言:javascript
复制
CUDA_VISIBLE_DEVICES=0 /path/to/binary -arg1 a -arg2 1.0

环境变量CUDA_VISIBLE_DEVICES的目的是让每个进程在不同的GPU上运行(默认情况下,所有进程都在同一个GPU上运行)。如果我不需要CUDA_VISIBLE_DEVICES,下面的代码就可以完美地工作了:

代码语言:javascript
复制
parallel -j 8 < commands.txt

我怎么才能避免这个问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-18 20:10:34

虽然--colsep有时可以工作,但它并不总是正确的选择。这将创建文件abcdef

代码语言:javascript
复制
echo 'touch abc\ def' | parallel -v --colsep ' ' A=B {}

通常,使用eval去掉表达式的引号会更好

代码语言:javascript
复制
echo 'touch abc\ def' | parallel -v eval A=B {}

所以:

代码语言:javascript
复制
parallel -j 8 'eval CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txt

如果您经常使用$(({%} - 1)),请考虑使用您自己的替换字符串:

代码语言:javascript
复制
echo '--rpl {%-1}\ $_=slot()-1' >> ~/.parallel/config
parallel -j 8 'eval CUDA_VISIBLE_DEVICES={%-1} {}' < commands.txt

或者甚至是:

代码语言:javascript
复制
echo '--rpl '"'"'{CUDA} $_="CUDA_VISIBLE_DEVICES=".(slot()-1)'"'" >> .parallel/config
parallel -j 8 'eval {CUDA} {}' < commands.txt
票数 1
EN

Stack Overflow用户

发布于 2019-01-18 06:36:03

使用--colsep ' '可以做到这一点:

代码语言:javascript
复制
parallel -j 8 --colsep ' ' 'CUDA_VISIBLE_DEVICES=$(({%} - 1)) {}' < commands.txt
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54243732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档