Eu tenho alguns scripts /tmp/foo/bar.sh
e /tmp/foo/baz.sh
, o seguinte:
# /tmp/foo/bar.sh
alias -g __FILE__='${(%):-%x}'
alias -g __DIR__='${${(%):-%x}%/*}'
printf "sourcing %s\n" __FILE__
printf "about to source %s/baz.sh\n" __DIR__
. /tmp/foo/baz.sh
. $( printf "%s/baz.sh" __DIR__ ) # succeeds
. __DIR__"/baz.sh" # fails
# /tmp/foo/baz.sh
printf "sourcing %s\n" __FILE__
O primeiro script, /tmp/foo/bar.sh
, define alguns aliases globais ( -g
) como encantamentos que devem ser expandidos ( para uma primeira aproximação !) caminho do script atual (invocação) e contém o diretório. Em seguida, ele usa esses aliases como argumentos em alguns comandos printf
. Por fim, ele origina o segundo script, /tmp/foo/baz.sh
, de três maneiras diferentes:
- usando o caminho literal para o segundo script;
- usando indiretamente o
__DIR__
alias, por meio de uma substituição de comando printf
;
- usando diretamente o
__DIR__
alias.
Veja o que recebo quando eu faço o primeiro script:
% (/usr/bin/env -i zsh -fc '. /tmp/foo/bar.sh')
sourcing /tmp/foo/bar.sh
about to source /tmp/foo/baz.sh
sourcing /tmp/foo/baz.sh
sourcing /tmp/foo/baz.sh
/tmp/foo/bar.sh:.:11: no such file or directory: __DIR__/baz.sh
(A música e dança com /usr/bin/env
é minha tentativa de usar /tmp/foo/bar.sh
como possíveis ambientes.)
Parece que se __DIR__
for imediatamente seguido por /baz.sh
, ele não será reconhecido como um alias, o que não é irracional. O formulário $( printf "%s/baz.sh" __DIR__ )
contorna este problema, mas sua extensão e convolutividade são praticamente o benefício de usar um alias em primeiro lugar.
Existe uma maneira mais conveniente de construir o caminho para a segunda string usando o __DIR__
alias?
Em geral, há algum "truque sintático" geral para alertar o analisador de que uma sequência específica de caracteres deve ser tratada como um alias? Minha esperança é fazer com que tal pseudônimo global se assemelhe mais ao comportamento de uma macro de pré-processador simples (em uma linha, sem argumentos, etc.). Um exemplo do tipo de "truque sintático" que tenho em mente é algo como o seguinte (nenhum dos quais funciona):
. {__DIR__}/baz.sh
. __DIR__"/baz.sh"