в то время как с ZDOTDIR, вы можете сказать, zshинтерпретировать файл с именем.zshrc в любом каталоге по вашему выбору, а интерпретировать любой файл по вашему выбору (не обязательно вызываемый .zshrc) оказывается довольно сложно.
В shили kshэмуляция, zshоценивает $ENV; так что вы можете добавить emulate zshв верхней части /path/to/fileи сделать:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Еще один очень запутанный подход может быть:
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
Это заслуживает небольшого объяснения.
${foo::=value}это расширение переменной, которое на самом деле устанавливает $foo . $functionsэто специальный ассоциативный массив, который отображает имена функций в их определения.
С promptsubstопцией, переменные в $PS1раскрываются. Таким образом, при первом запросе переменные в этом PS1 будут расширены.
Эта zsh_directory_nameфункция представляет собой специальную функцию, которая помогает расширить ~fooдо /path/to/somethingи наоборот. Это используется, например, %~в приглашении, чтобы, если текущий каталог был, /opt/myproj/proj/xвы могли отобразить его ~proj:x, выполнив zsh_directory_nameсопоставление proj:x<=> /opt/myproj/proj/x. Это также используется Dфлагом расширения параметра. Так что, если кто-то расширяется${(D)somevar} , эта zsh_directory_nameфункция будет вызвана.
Здесь мы используем ${(D):-}, ${:-}то есть, ${no_var:-nothing}расширяется до nothingif $no_varпусто, поэтому ${(D):-}расширяется до нуля во время вызова zsh_directory_name. zsh_directory_nameранее был определен как:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
То есть, на первое расширение PS1 (на первой строке), ${(D):-}приведет к тому , promptsubstвозможность быть снята с охраны (отменить -o promptsubst), zsh_directory_name()чтобы быть неопределенным (как мы хотим , чтобы запустить его только один раз) , $PS1чтобы быть снята с охраны, а также /path/to/fileбыть получены.
${PS1=%m%# }расширяется (и присваивается $PS1) до тех %m%#пор, пока PS1 уже не был определен (например, /path/to/fileпосле после unset), и %m%#оказывается значением по умолчанию PS1.