Почему ZSH заменяет дефисы с подчеркиванием в этих функциях?

Вы можете посмотреть проект squashmount . Он монтирует каталог как с системой squashfs, так и с системой autofs / overlay / overlayfs, чтобы обеспечить сжатие доступа ro, а также доступ для записи. Полностью настраивается в зависимости от того, сколько изменений требует повторного сжатия, его удобно использовать для хранения базы данных, репозиториев и т. Д.

0
22.10.2018, 19:13
1 ответ

Это не zshзаменяет тире символами подчеркивания, а, вероятно, эта docker-composeпрограмма или другая программа, вызываемая ею.

Проблема в том, что zsh, в отличие от bash, не разделяет переменные без кавычек с IFSпо умолчанию.

Если я определяю docker-composeкак функцию, которая печатает каждый свой аргумент, окруженный {}, вот что я получаю:

$ cat example
docker-compose() {
        echo -n docker-compose
        for f in "$@"; do echo -n " {$f}"; done; echo
}
compose() { docker-compose $*; }
run() { compose "run --rm app $*"; }
rails() { run "rails $*"; }   
rails c

$ zsh example
docker-compose {run --rm app rails c}

$ bash example
docker-compose {run} {--rm} {app} {rails} {c}

Обратите внимание, как run, --rm, appи т. д. передаются как отдельные аргументы в bashи как один аргумент в zsh.

Это потому, что bashразделил и обрезал переменную $*на несколько аргументов, используя пробелы (значение по умолчанию дляIFS)в качестве разделителя. Тот же эффект можно получить в zsh, используя $=*вместо $*или с помощью опции set -o SH_WORD_SPLIT, но это сделает скрипт только zsh -.

Вы должны использовать "$@"вместо $*везде, если только у вас нет особых причин не использовать:

compose() { docker-compose "$@"; }
run() { compose run --rm app "$@"; }
rails() { run rails "$@"; }
5
28.01.2020, 02:16

Теги

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