Car*_*cho 2 bash command-line gnu-parallel
我目前正在并行测试 gnu 以使用 bash 在多个服务器之间分发比较命令。在其最基本的功能中,此比较命令需要两个输入进行比较(oracle 数据库访问),并需要通过 -o 输出文件名。程序至少需要一个动作加载、保存或直接上传。
compare -o cmp.input1.input2.dat Input1 Input2
Run Code Online (Sandbox Code Playgroud)
我有几千个这样的输入对并创建一个包含所有组合的文件,以便每一行都包含程序所需的输出文件名和数据库标识符
#test_parallel
-o cmp.input1.input2.dat Input1 Input2
-o cmp.input1.input3.dat Input1 Input3
-o cmp.input2.input3.dat Input2 Input3
[...]
Run Code Online (Sandbox Code Playgroud)
并使用并行执行命令,但是比较命令失败
parallel -a test_parallel "compare {}"
ERROR: No action specified for results (load, save or direct upload)
usage: compare [-u][-o <file>] query target
Run Code Online (Sandbox Code Playgroud)
使用--dryrun
模式这是并行执行的:
compare -o\ cmp.input1.input2.dat\ Input1\ Input2
Run Code Online (Sandbox Code Playgroud)
由于某种原因,我不明白,比较程序没有正确处理转义的空格。在 bash 中执行此命令会导致完全相同的错误消息消息。在 -o 标志之后删除转义符(我可以将 -o 移动到并行命令)会导致“参数过多”错误。删除所有转义符会按预期执行命令。
是否可以告诉 parallel 在命令调用中不打印转义符?我似乎没有在文档中找到任何内容,除了这是预期的默认行为,如parallel --shellquote
GNU Parallel 将输入视为单个参数并引用它,以便您可以安全地使用文件名,例如:
My brother's 12" records costs 30$ each.txt
Run Code Online (Sandbox Code Playgroud)
在您的情况下,您希望 shell 解析参数,因此空格将不加引号:
parallel -a test_parallel eval compare {}
Run Code Online (Sandbox Code Playgroud)
或者你可以分割空间:
parallel --colsep ' ' -a test_parallel compare {1} {2} {3} {4}
Run Code Online (Sandbox Code Playgroud)
但既然你想比较 all 和 all,你可以更优雅地进行比较:
parallel cmp -o ../out/cmp.{1}.{2} {1} {2} ::: Input* ::: Input*
Run Code Online (Sandbox Code Playgroud)
这会将所有 Input* 与所有 Input* 进行比较。有了--results
你可以得到很好的结构在DIR输出:
parallel --results out/ cmp {1} {2} ::: Input* ::: Input*
Run Code Online (Sandbox Code Playgroud)
但是,如果您想cmp InputY InputX
在已经运行后跳过运行,cmd InputX InputY
那么您可以这样做:
parallel --results out/ cmp {=1' $arg[1] ge $arg[2] and $job->skip();' =} {2} ::: Input* ::: Input*
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1450 次 |
最近记录: |