trong khi với ZDOTDIR, bạn có thể yêu zsh
cầu giải thích một tệp được gọi .zshrc
trong 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 sh
hoặc ksh
thi đua, zsh
đánh giá $ENV
; vì vậy bạn có thể thêm emulate zsh
ở đầu của bạn /path/to/file
và 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
. $functions
là 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 promptsubst
tù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_name
chức năng là một chức năng đặc biệt giúp mở rộng ~foo
đến /path/to/something
và 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/x
bạn có thể hiển thị nó ~proj:x
bằng cách zsh_directory_name
thực hiện ánh xạ proj:x
<=> /opt/myproj/proj/x
. Điều đó cũng được sử dụng bởi D
cờ mở rộng tham số. Vì vậy, nếu một mở rộng ${(D)somevar}
, zsh_directory_name
chức năng đó sẽ được gọi.
Ở đây, chúng tôi đang sử dụng ${(D):-}
, ${:-}
đó là ${no_var:-nothing}
mở rộng nothing
nếu $no_var
trống, vì vậy ${(D):-}
mở rộng thành không có gì trong khi gọi zsh_directory_name
. zsh_directory_name
trướ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 promptsubst
tù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/file
sau sau unset
) và %m%#
tình cờ là giá trị mặc định của PS1
.