enquanto com o ZDOTDIR, você pode dizer zsh
para interpretar um arquivo chamado .zshrc
em qualquer diretório de sua escolha, e interpretar qualquer arquivo de sua escolha (não necessariamente chamado .zshrc
) se mostra bastante difícil.
Em sh
ou ksh
emulação, zsh
avalia $ENV
; para que você possa adicionar emulate zsh
na parte superior do seu /path/to/file
e fazer:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Outra abordagem muito complicada poderia ser:
ssh -t host 'PS1='\''${${functions[zsh_directory_name]::="
set +o promptsubst
unset -f zsh_directory_name
unset PS1
. /path/to/file
"}+}${(D):-}${PS1=%m%# }'\' exec zsh -o promptsubst -f
Esse merece uma explicação.
${foo::=value}
é uma expansão variável que realmente define $foo
. $functions
é uma matriz associativa especial que mapeia nomes de funções para suas definições.
Com a promptsubst
opção, as variáveis in $PS1
são expandidas. Portanto, no primeiro prompt, as variáveis nesse PS1 serão expandidas.
A zsh_directory_name
função é uma função especial que ajuda a expandir o ~foo
para /path/to/something
e o inverso. Isso é usado, por exemplo, %~
no prompt para que, se o diretório atual estiver, /opt/myproj/proj/x
você possa exibi-lo como ~proj:x
fazendo zsh_directory_name
o mapeamento proj:x
<=> /opt/myproj/proj/x
. Isso também é usado pelo D
sinalizador de expansão de parâmetro. Portanto, se alguém se expandir ${(D)somevar}
, essa zsh_directory_name
função será chamada.
Aqui, estamos usando ${(D):-}
, ${:-}
que é ${no_var:-nothing}
se expande para nothing
se $no_var
está vazio, então ${(D):-}
se expande para nada ao chamar zsh_directory_name
. zsh_directory_name
foi definido anteriormente como:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Ou seja, na primeira expansão do PS1 (no primeiro prompt), ${(D):-}
a promptsubst
opção será desabilitada (para cancelar a -o promptsubst
), zsh_directory_name()
indefinida (como queremos executá-la apenas uma vez) $PS1
, desabilitada e /path/to/file
originada.
${PS1=%m%# }
expande (e atribui $PS1
) a %m%#
menos que o PS1 já esteja definido (por exemplo, /path/to/file
após o unset
) e %m%#
passa a ser o valor padrão de PS1
.