*
не интерпретируется утилитой zip, а расширяется оболочкой. Перед запуском утилиты zip *
заменяется на список разделенных пробелами всех не скрытых файлов или каталогов.
Вы можете доказать это, заменив $PATCH/zip
на echo
, который покажет аргументы, которые фактически передаются программе после искажения оболочки.
Если вы установите переменную окружения GLOBIGNORE
в .:..
, bash не только отключит сопоставление .
и ..
, но также имеет приятный эффект автоматического включения 'dotglob', который соответствует другим скрытые файлы без необходимости .*
, так что вы можете просто использовать *
для всего.
Например, это должно решить вашу проблему:
GLOBIGNORE=.:..; $PATCH/zip -r -l -x "bac*" abc.zip HOME/*; unset GLOBIGNORE
Обратите внимание, что вы не можете сделать это коротким путем или одной командой:
GLOBIGNORE=.:.. $PATCH/zip -r -l -x "bac*" abc.zip HOME/*
Кажется, что bash не замечает этого до следующей команды.