Проблема в утилите GNU Parallel. Даже если кажется, что вы передаете ему программу для запуска с аргументами, на самом деле она объединяет аргументы и передает их в оболочку.
Более того, Parallel либо запускает ту же оболочку, из которой вы запускали parallel
, либо выбирает оболочку на основе переменной окружения SHELL
(что сомнительно, поскольку эта переменная окружения также используется эмуляторами терминала для определения, какая интерактивная оболочка бежать). В любом случае, именно поэтому он выбирает zsh, а не sh. У вас будет та же проблема с оболочкой, совместимой с sh (bash, dash, ksh,…), но реже: sh оставляет шаблоны в покое, если они ничего не соответствуют, поэтому с sh ваш скрипт будет работать до тех пор, пока в текущем каталоге не найдено файлов, соответствующих *to?be?deleted*
.
Решение дано в руководстве, но найти его немного сложно: передайте опцию -q
. В руководстве есть очень длинная глава о цитировании, которую вы можете игнорировать 99% времени: просто пропустите -q
, если вы не намеревались запустить сценарий оболочки , а не команду . Кроме того, вы должны использовать полный путь к команде, иначе параллель может вызвать встроенную оболочку или даже функцию (если ваша оболочка - bash). Кроме того, установите SHELL
на /bin/sh
, потому что даже при -q
Parallel запускает оболочку и предполагает, что она совместима с sh (я думаю, что zsh достаточно совместим, но я не совсем уверен.). См. Также аналогичный вопрос по Unix Stack Exchange
SHELL=/bin/sh parallel -q -j10 "$(command -v rsync)" --exclude "*to?be?deleted*" testing somewhere_else:/some/where/else
(Да, руководство отговаривает вас от использования -q
, но это неправильно. Я уже спорил с автором об этом раньше.)