Как передать аргументы в кавычках в GNU Parallel

Мне нужно передать некоторый текст, содержащий пробелы и другие символы, в скрипт, который запускается GNU Parallel.

Вот очень простой пример:

$ seq 1 3 | parallel echo "Quoted ' (text)"

Приведенный выше пример выведет это:

sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file
sh: -c: line 0: unexpected EOF while looking for matching `''
sh: -c: line 1: syntax error: unexpected end of file    

Однако, если я это сделаю, все работает:

seq 1 3 | parallel echo "\"Quoted ' (text)\""

Я запускаю это из скрипта Python, поэтому перед передачей аргументов я дважды заключаю их в кавычки в скрипте следующим образом:

args = ["Some arg", "Another arg", "etc."]
args = ' '.join(pipes.quote(pipes.quote(arg)) for arg in args)

Но это не похоже на чистое решение.

Кто-нибудь знает лучший способ передачи аргументов в GNU Parallel?

Спасибо!


person chaimp    schedule 22.11.2011    source источник
comment
«не чистое решение», но работает ли оно? Удачи.   -  person shellter    schedule 22.11.2011


Ответы (2)


zsh-4.3.12[sysadmin]% print -l {1..3} | 
  parallel -q echo "Quoted ' (text)"
Quoted ' (text) 1
Quoted ' (text) 2
Quoted ' (text) 3

Как описано @mortehu:

Аргументы, передаваемые командам через parallel, расширяются оболочкой дважды: один раз при вызове parallel и один раз, когда parallel запускает вашу команду. -q предотвращает второе расширение оболочки.

person Dimitre Radoulov    schedule 22.11.2011
comment
Благодарю вас! Я искал справочную страницу для чего-то такого простого, но не смог найти. Спасибо, что ответили так четко и не сказали что-то вроде «Прочитайте справочную страницу»! Так просто. - person chaimp; 22.11.2011
comment
Чтобы сделать это немного яснее: аргументы, переданные командам через parallel, расширяются оболочкой дважды: один раз при вызове parallel и один раз, когда parallel запускает вашу команду. -q предотвращает второе расширение оболочки. - person mortehu; 27.02.2018

На справочной странице есть целый раздел, посвященный цитированию:

http://www.gnu.org/s/parallel/man.html#QUOTING

В нем даже упоминаются те самые сообщения об ошибках, которые вы пишете в своем вопросе.

Если вы можете написать лучше, пришлите вашу версию по адресу: [email protected].

person Ole Tange    schedule 23.11.2011