в той час, як із 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якщо $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.