ในขณะที่ใช้ 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_namezsh_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