Command-Line

防止 GNU 並行拆分引用的參數

  • September 30, 2017

我正在嘗試使用GNU Parallel來執行 comman mutliple times,並結合使用常量和可變參數。但是由於某種原因,即使我在將它們傳遞給parallel.

在此範例中,'a b'應將常量參數debug-call作為單個參數而不是兩個傳遞給:

$ parallel debug-call 'a b' {} ::: {1..2}
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '1'
[0] = '[...]/debug-call'
[1] = 'a'
[2] = 'b'
[3] = '2'

debug-call是一個簡單的腳本,它列印傳入的每個參數argv。相反,我希望看到這個輸出:

[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '1'
[0] = '[...]/debug-call'
[1] = 'a b'
[2] = '2'

這是一個錯誤還是有一個選項可以防止 GNU Parallel 在將命令行參數傳遞給命令之前拆分它們?

parallel執行一個 shell(具體取決於呼叫它的上下文,通常,當從 shell 呼叫時,它是同一個 shell)來解析參數的串聯。

所以:

parallel debug-call 'a b' {} ::: 'a b' c

是相同的

parallel 'debug-call a b {}' ::: 'a b' c

parallel將會通知:

your-shell -c 'debug-call a b <something>'

該外殼的參數(希望)在哪裡<something>正確引用。例如,如果那個 shell 是bash,它將執行

bash -c 'debug-call a b a\ b'

在這裡,你想要:

parallel 'debug-call "a b" {}' ::: 'a b' c

或者

parallel -q debug-call 'a b' {} ::: 'a b' c

在連接之前,將在哪裡parallel引用參數(以正確的(希望是shell的)語法)。

為了避免一開始就呼叫 shell,您可以改用 GNU xargs

xargs -n1 -r0 -P4 -a <(printf '%s\0' 'a b' c) debug-call 'a b'

這不會呼叫 shell(也不會parallel在初始化時執行的許多命令中的任何一個),但您不會從 . 的任何額外功能中受益parallel,例如使用-k.

您可能會在並行後台執行中找到其他方法

引用自:https://unix.stackexchange.com/questions/364129