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