Não é zsh
que está substituindo traços por sublinhados, mas provavelmente esse programa docker-compose
ou outro programa chamado por ele.
O problema é que zsh
, ao contrário de bash
, não divide variáveis não citadas com IFS
por padrão.
Se eu definir docker-compose
como uma função que imprime cada um dos seus argumentos entre {}
, é isso que obtenho:
$ 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}
Observe como run
, --rm
, app
, etc. são passados como argumentos separados em bash
e como um único argumento em zsh
.
Isso porque bash
dividiu e reduziu a variável $*
em vários argumentos usando espaços (o valor padrão de IFS
) como delimitador. O mesmo efeito pode ser obtido em zsh
usando $=*
em vez de $*
ou pela opção set -o SH_WORD_SPLIT
, mas isso tornará o script somente zsh.
Você deve usar "$@"
em vez de $*
em todos os lugares, a menos que tenha uma razão muito especial para não:
compose() { docker-compose "$@"; }
run() { compose run --rm app "$@"; }
rails() { run rails "$@"; }