Как передать кавычки в GNU Parallel - PullRequest
11 голосов
/ 22 ноября 2011

Мне нужно передать некоторый текст, который включает пробелы и другие символы, в скрипт, который запускается 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?

Спасибо!

Ответы [ 2 ]

13 голосов
/ 22 ноября 2011
zsh-4.3.12[sysadmin]% print -l {1..3} | 
  parallel -q echo "Quoted ' (text)"
Quoted ' (text) 1
Quoted ' (text) 2
Quoted ' (text) 3

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

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

10 голосов
/ 23 ноября 2011

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

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

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

Если вы можете написать это лучше, пожалуйста, отправьте свою версию по электронной почте: parallel@gnu.org.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...