sementara dengan ZDOTDIR, Anda dapat meminta zshuntuk menginterpretasikan file yang dipanggil .zshrcdi direktori mana pun yang Anda pilih, setelah itu menafsirkan file apa pun yang Anda pilih (tidak harus disebut .zshrc) terbukti cukup sulit.
Dalam shatau kshemulasi, zshevaluasi $ENV; sehingga Anda dapat menambahkan emulate zshdi bagian atas Anda /path/to/filedan lakukan:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Pendekatan lain yang sangat berbelit-belit adalah:
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
Yang itu layak mendapat sedikit penjelasan.
${foo::=value}adalah ekspansi variabel yang benar-benar ditetapkan $foo . $functionsadalah array asosiatif khusus yang memetakan nama fungsi ke definisi mereka.
Dengan promptsubstopsi, variabel dalam $PS1diperluas. Jadi, pada prompt pertama, variabel dalam PS1 akan diperluas.
The zsh_directory_namefungsi fungsi khusus yang membantu memperluas ~fooke /path/to/somethingdan sebaliknya. Itu digunakan misalnya dengan %~di prompt sehingga jika direktori saat ini /opt/myproj/proj/xAnda dapat menampilkannya ~proj:xdengan zsh_directory_namemelakukan pemetaan proj:x<=> /opt/myproj/proj/x. Itu juga digunakan oleh Dflag ekspansi parameter. Jadi jika seseorang mengembang ${(D)somevar}, zsh_directory_namefungsi itu akan dipanggil.
Di sini, kami menggunakan ${(D):-},, ${:-}yang ${no_var:-nothing}diperluas ke nothingjika $no_varkosong, jadi ${(D):-}perluas apa-apa saat memanggil zsh_directory_name. zsh_directory_namesebelumnya telah didefinisikan sebagai:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Yaitu, pada ekspansi PS1 pertama (setelah prompt pertama), ${(D):-}akan menyebabkan promptsubstopsi tidak disetel (untuk membatalkan -o promptsubst), zsh_directory_name()menjadi tidak terdefinisi (karena kami ingin menjalankannya hanya sekali) $PS1menjadi tidak disetel, dan /path/to/filemenjadi sumber.
${PS1=%m%# }memperluas (dan menetapkan $PS1) ke %m%#kecuali PS1 sudah didefinisikan (misalnya dengan /path/to/filesetelah unset), dan %m%#kebetulan menjadi nilai default dari PS1.