podczas gdy w ZDOTDIR możesz zsh
zinterpretować plik wywoływany .zshrc
w dowolnym wybranym katalogu, interpretacja dowolnego pliku (niekoniecznie wywołanego .zshrc
) okazuje się dość trudna.
W sh
lub ksh
emulacji, zsh
ocenia $ENV
; więc możesz dodać emulate zsh
u góry /path/to/file
i 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
. $functions
to specjalna tablica asocjacyjna, która odwzorowuje nazwy funkcji na ich definicje.
Dzięki tej promptsubst
opcji zmienne w $PS1
są rozszerzane. Tak więc po pierwszym pytaniu zmienne w tym PS1 zostaną rozwinięte.
Ta zsh_directory_name
funkcja jest funkcją specjalną, która pomaga rozwinąć ~foo
do /path/to/something
i 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:x
poprzez zsh_directory_name
mapowanie proj:x
<=> /opt/myproj/proj/x
. Jest to również używane przez D
flagę rozszerzenia parametru. Więc jeśli ktoś się rozszerzy ${(D)somevar}
, zsh_directory_name
funkcja ta zostanie wywołana.
Tutaj używamy ${(D):-}
, ${:-}
czyli ${no_var:-nothing}
rozszerza się nothing
, gdy $no_var
jest pusty, więc ${(D):-}
rozwija się niczym podczas wywoływania zsh_directory_name
. zsh_directory_name
został 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 promptsubst
opcji (anulowanie -o promptsubst
), zsh_directory_name()
niezdefiniowanie (ponieważ chcemy uruchomić ją tylko raz) $PS1
i /path/to/file
wyłączenie.
${PS1=%m%# }
rozwija się (i przypisuje $PS1
) do, %m%#
chyba że PS1 został już zdefiniowany (na przykład /path/to/file
po po unset
) i %m%#
zdarza się, że jest wartością domyślną PS1
.