podczas gdy w ZDOTDIR możesz zshzinterpretować plik wywoływany .zshrcw dowolnym wybranym katalogu, interpretacja dowolnego pliku (niekoniecznie wywołanego .zshrc) okazuje się dość trudna.
W shlub kshemulacji, zshocenia $ENV; więc możesz dodać emulate zshu góry /path/to/filei zrobić:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Innym bardzo skomplikowanym podejściem może być:
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
Ten zasługuje na trochę wyjaśnienia.
${foo::=value}jest zmiennym rozszerzeniem, które faktycznie ustawia $foo . $functionsto specjalna tablica asocjacyjna, która odwzorowuje nazwy funkcji na ich definicje.
Dzięki tej promptsubstopcji zmienne w $PS1są rozszerzane. Tak więc po pierwszym pytaniu zmienne w tym PS1 zostaną rozwinięte.
Ta zsh_directory_namefunkcja jest funkcją specjalną, która pomaga rozwinąć ~foodo /path/to/somethingi do tyłu. Jest to używane na przykład %~w znaku zachęty, więc jeśli bieżącym katalogiem jest /opt/myproj/proj/x, możesz go wyświetlić tak jak ~proj:xpoprzez zsh_directory_namemapowanie proj:x<=> /opt/myproj/proj/x. Jest to również używane przez Dflagę rozszerzenia parametru. Więc jeśli ktoś się rozszerzy ${(D)somevar}, zsh_directory_namefunkcja ta zostanie wywołana.
Tutaj używamy ${(D):-}, ${:-}czyli ${no_var:-nothing}rozszerza się nothing, gdy $no_varjest pusty, więc ${(D):-}rozwija się niczym podczas wywoływania zsh_directory_name. zsh_directory_namezostał wcześniej zdefiniowany jako:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Oznacza to, że po pierwszym rozszerzeniu PS1 (po pierwszym pytaniu) ${(D):-}spowoduje wyłączenie promptsubstopcji (anulowanie -o promptsubst), zsh_directory_name()niezdefiniowanie (ponieważ chcemy uruchomić ją tylko raz) $PS1i /path/to/filewyłączenie.
${PS1=%m%# }rozwija się (i przypisuje $PS1) do, %m%#chyba że PS1 został już zdefiniowany (na przykład /path/to/filepo po unset) i %m%#zdarza się, że jest wartością domyślną PS1.