enquanto com o ZDOTDIR, você pode dizer zshpara interpretar um arquivo chamado .zshrcem qualquer diretório de sua escolha, e interpretar qualquer arquivo de sua escolha (não necessariamente chamado .zshrc) se mostra bastante difícil.
Em shou kshemulação, zshavalia $ENV; para que você possa adicionar emulate zshna parte superior do seu /path/to/filee 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 promptsubstopção, as variáveis in $PS1são expandidas. Portanto, no primeiro prompt, as variáveis nesse PS1 serão expandidas.
A zsh_directory_namefunção é uma função especial que ajuda a expandir o ~foopara /path/to/somethinge o inverso. Isso é usado, por exemplo, %~no prompt para que, se o diretório atual estiver, /opt/myproj/proj/xvocê possa exibi-lo como ~proj:xfazendo zsh_directory_nameo mapeamento proj:x<=> /opt/myproj/proj/x. Isso também é usado pelo Dsinalizador de expansão de parâmetro. Portanto, se alguém se expandir ${(D)somevar}, essa zsh_directory_namefunção será chamada.
Aqui, estamos usando ${(D):-}, ${:-}que é ${no_var:-nothing}se expande para nothingse $no_varestá vazio, então ${(D):-}se expande para nada ao chamar zsh_directory_name. zsh_directory_namefoi 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 promptsubstopção será desabilitada (para cancelar a -o promptsubst), zsh_directory_name()indefinida (como queremos executá-la apenas uma vez) $PS1, desabilitada e /path/to/fileoriginada.
${PS1=%m%# }expande (e atribui $PS1) a %m%#menos que o PS1 já esteja definido (por exemplo, /path/to/fileapós o unset) e %m%#passa a ser o valor padrão de PS1.