gnu 并行删除命令中空格字符前的转义

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

Ole*_*nge 5

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)