Для темных терминалов я определенно рекомендую zenburn набор цветов. Вы найдете примеры для varuious приложений, включая urxvt
, если Вы делаете веб-поиск "zenburn".
Ваша проблема не имеет никакого отношения к удару. На самом деле, так как Вы говорите 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
опции препятствуют.
name
не было необходимо). Я думал, что одинарные кавычки должны уладить вещи, и раздел QUOTING страницы справочника был очень необходим в конце для выяснения то, что продолжалось (снова вопреки ожиданиям). – Wojtek Rzepala 08.08.2013, 01:18{}
,{.}
... для оболочки. По этой причине Вы не должны заключать его в кавычки сами (такrici
решение неверно в том отношении), и необходимо избежать обратных галочек для замены команды. – Stéphane Chazelas 08.08.2013, 07:32