в то время как с 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}
расширяется до nothing
if $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
.