sementara dengan ZDOTDIR, Anda dapat meminta zsh
untuk menginterpretasikan file yang dipanggil .zshrc
di direktori mana pun yang Anda pilih, setelah itu menafsirkan file apa pun yang Anda pilih (tidak harus disebut .zshrc
) terbukti cukup sulit.
Dalam sh
atau ksh
emulasi, zsh
evaluasi $ENV
; sehingga Anda dapat menambahkan emulate zsh
di bagian atas Anda /path/to/file
dan 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
. $functions
adalah array asosiatif khusus yang memetakan nama fungsi ke definisi mereka.
Dengan promptsubst
opsi, variabel dalam $PS1
diperluas. Jadi, pada prompt pertama, variabel dalam PS1 akan diperluas.
The zsh_directory_name
fungsi fungsi khusus yang membantu memperluas ~foo
ke /path/to/something
dan sebaliknya. Itu digunakan misalnya dengan %~
di prompt sehingga jika direktori saat ini /opt/myproj/proj/x
Anda dapat menampilkannya ~proj:x
dengan zsh_directory_name
melakukan pemetaan proj:x
<=> /opt/myproj/proj/x
. Itu juga digunakan oleh D
flag ekspansi parameter. Jadi jika seseorang mengembang ${(D)somevar}
, zsh_directory_name
fungsi itu akan dipanggil.
Di sini, kami menggunakan ${(D):-}
,, ${:-}
yang ${no_var:-nothing}
diperluas ke nothing
jika $no_var
kosong, jadi ${(D):-}
perluas apa-apa saat memanggil zsh_directory_name
. zsh_directory_name
sebelumnya 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 promptsubst
opsi tidak disetel (untuk membatalkan -o promptsubst
), zsh_directory_name()
menjadi tidak terdefinisi (karena kami ingin menjalankannya hanya sekali) $PS1
menjadi tidak disetel, dan /path/to/file
menjadi sumber.
${PS1=%m%# }
memperluas (dan menetapkan $PS1
) ke %m%#
kecuali PS1 sudah didefinisikan (misalnya dengan /path/to/file
setelah unset
), dan %m%#
kebetulan menjadi nilai default dari PS1
.