Объявление переменной параллельно sh-c …

Для темных терминалов я определенно рекомендую zenburn набор цветов. Вы найдете примеры для varuious приложений, включая urxvt, если Вы делаете веб-поиск "zenburn".

4
13.09.2017, 14:01
1 ответ

Ваша проблема не имеет никакого отношения к удару. На самом деле, так как Вы говорите parallel работать sh, Вы даже не можете использовать bash.

Проблема - то, что параллель не является действительно общедоступной заменой для xargs, как его документация указывает. Вместо этого это накапливает свои аргументы в единственную строку (с пробелами между ними) и затем интерпретирует это как ряд команд. Так, в Вашем случае Вы имеете:

sh -c 'name="{.}"; echo {.} ${name%.*}.tpr'

который интерпретируется как

sh -c 'name="{.}";
echo {.} ${name.*}.tpr

Так как это - две отдельных команды, и первый выполняется в подоболочке (sh -c), $name не установлен во втором.

Теперь, Вы могли добавить вполне прилично что-либо к началу строки, такой как true:

sh -c 'true; name="{.}"; echo {.} ${name%.*}.tpr'

Это будет интерпретироваться как:

sh -c 'true'
name="{.}"
echo {.} ${name%.*}.tpr'

В этом случае, вызов к sh по существу предмет одноразового использования; затем name установлен в среде, сохраняемой parallel и наконец echo с называют name набор.

Таким образом, казалось бы, что самое легкое решение состоит в том, чтобы просто избавиться от ненужного вызова к sh:

find 1st 2nd 3rd -name '*.xtc' -print0 |
parallel -0 'name={.}; echo {.} "${name%.*}.tpr"'

Примечание: На основе подсказки, данной @StephaneChazelas, я удалил кавычки вокруг {.} и добавил их вокруг ${name%.*}.ptr. параллель делает свое собственное заключение в кавычки ее собственных замен, которое вмешивается некоторыми нечетными способами в явные кавычки. Однако это не добавляет заключение в кавычки для окружения замен, которые должны быть заключены в кавычки, если существует возможность разделяемой на слово замены.

Другая опция, если бы Вы действительно хотите использовать подоболочку по некоторым причинам (или конкретную подоболочку), состояла бы в том, чтобы использовать -q опция:

find 1st 2nd 3rd -name '*.xtc' -print0 |
parallel -0 -q sh -c 'name="{.}"; echo "{.}" "${name%.*}.tpr"'

Примечание: Как выше, я скорректировал кавычки. В этом случае, явное -q подавляет заключение в кавычки замен, таким образом, необходимо заключить им в кавычки явно. Однако это - текстовая цитата, которая менее точна, чем заключение в кавычки оболочки; если замена будет включать символ двойной кавычки, то того символа не оставят, таким образом, это закроет явные кавычки, повреждая командную строку и эффективно представляя уязвимость инжекции команды (Вы добрались бы, другие проблемы для имен файлов содержат $, `, или \ символы). Для этого, среди других причин, -q опции препятствуют.

5
27.01.2020, 20:54
  • 1
    Это - очень положительная сторона. Я действительно ожидал, что это будет вести себя как xargs (где первое, пустое объявление name не было необходимо). Я думал, что одинарные кавычки должны уладить вещи, и раздел QUOTING страницы справочника был очень необходим в конце для выяснения то, что продолжалось (снова вопреки ожиданиям). –  Wojtek Rzepala 08.08.2013, 01:18
  • 2
    @WojtekRzepala. Да, к сожалению, параллель GNU всегда называет оболочку и заключает в кавычки {}, {.}... для оболочки. По этой причине Вы не должны заключать его в кавычки сами (так riciрешение неверно в том отношении), и необходимо избежать обратных галочек для замены команды. –  Stéphane Chazelas 08.08.2013, 07:32
  • 3
    @StephaneChazelas: хорошо, я думаю, что разработал его. Не стесняйтесь критиковать, если я понял его превратно. –  rici 08.08.2013, 08:22

Теги

Похожие вопросы