GNU Parallel: не заключать в кавычки значения строк замены Perl, содержащие пробелы? - PullRequest
2 голосов
/ 21 июня 2019

Сценарий, с которым я пишу parallel, в настоящее время выглядит следующим образом:

#!/bin/bash
seq ${2:-3} | parallel --tty -j0 sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q $1 '2>/dev/null'

Например, при запуске ./sidrender.sh Stomp.sid ожидается выполнение следующих команд:

sidplayfp -wch1.wav -u2 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch2.wav -u1 -u3 -q Stomp.sid 2>/dev/null
sidplayfp -wch3.wav -u1 -u2 -q Stomp.sid 2>/dev/null

Однако, это не работает должным образом, и при просмотре с --dry-run получается, что parallel заключает в кавычки флаги -u (например, sidplayfp -wch1.wav '-u2 -u3' -q Stomp.sid 2>/dev/null), потому что они происходят из одного и того же выражения Perl.

Вот минимальный пример того, что происходит:

$ parallel --dry-run 'echo {= $_="foo bar" =}' ::: 1
echo 'foo bar'

Если вы замените "foo bar" на "foo", вы получите echo foo без кавычек.

Поскольку sidplayfp неправильно анализирует аргументы, когда они заключаются в кавычки, мне нужен способ остановить parallel цитирование вывода, но я не могу найти способ сделать это на странице man.

1 Ответ

2 голосов
/ 22 июня 2019

Использование eval:

seq ${2:-3} |
  parallel --tty -j0 eval sidplayfp -wch{}.wav '{=$_=join" ",map{"-u".$_}grep!/@{[seq()]}/,(1..total_jobs())=}' ${@:3} -q $1 '2>/dev/null'
...