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