trong khi với ZDOTDIR, bạn có thể yêu zshcầu giải thích một tệp được gọi .zshrctrong bất kỳ thư mục nào bạn chọn, việc nó diễn giải bất kỳ tệp nào bạn chọn (không nhất thiết phải gọi .zshrc) tỏ ra khá khó khăn.
Trong shhoặc kshthi đua, zshđánh giá $ENV; vì vậy bạn có thể thêm emulate zshở đầu của bạn /path/to/filevà làm:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Một cách tiếp cận rất phức tạp khác có thể là:
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
Điều đó xứng đáng một chút giải thích.
${foo::=value}là một mở rộng biến mà thực sự thiết lập $foo . $functionslà một mảng kết hợp đặc biệt ánh xạ tên hàm theo định nghĩa của chúng.
Với promptsubsttùy chọn, các biến trong $PS1được mở rộng. Vì vậy, theo dấu nhắc đầu tiên, các biến trong PS1 đó sẽ được mở rộng.
Các zsh_directory_namechức năng là một chức năng đặc biệt giúp mở rộng ~foođến /path/to/somethingvà ngược lại. Ví dụ, nó được sử dụng %~trong lời nhắc để nếu thư mục hiện tại là /opt/myproj/proj/xbạn có thể hiển thị nó ~proj:xbằng cách zsh_directory_namethực hiện ánh xạ proj:x<=> /opt/myproj/proj/x. Điều đó cũng được sử dụng bởi Dcờ mở rộng tham số. Vì vậy, nếu một mở rộng ${(D)somevar}, zsh_directory_namechức năng đó sẽ được gọi.
Ở đây, chúng tôi đang sử dụng ${(D):-}, ${:-}đó là ${no_var:-nothing}mở rộng nothingnếu $no_vartrống, vì vậy ${(D):-}mở rộng thành không có gì trong khi gọi zsh_directory_name. zsh_directory_nametrước đây đã được định nghĩa là:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Đó là, khi mở rộng PS1 đầu tiên (theo dấu nhắc đầu tiên), ${(D):-}sẽ khiến promptsubsttùy chọn không được đặt (hủy bỏ -o promptsubst), zsh_directory_name()không được xác định (vì chúng tôi chỉ muốn chạy nó một lần) $PS1để không được đặt và /path/to/fileđược cung cấp.
${PS1=%m%# }mở rộng (và gán $PS1) cho %m%#trừ khi PS1 đã được xác định (ví dụ /path/to/filesau sau unset) và %m%#tình cờ là giá trị mặc định của PS1.