Während mit ZDOTDIR, können Sie sagen zsh eine Datei, die .zshrcin einem beliebigen Verzeichnis Ihrer Wahl aufgerufen wird, interpretiert werden soll. Die Interpretation einer beliebigen Datei (die nicht unbedingt aufgerufen wird .zshrc) ist jedoch recht schwierig.
In shoder kshEmulation, zshwertet aus $ENV; so können Sie emulate zsham oberen Rand Ihrer hinzufügen/path/to/file und tun:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Ein anderer sehr komplizierter Ansatz könnte sein:
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
Das verdient eine Erklärung.
${foo::=value}ist eine variable Erweiterung, die tatsächlich setzt $foo .$functionsist ein spezielles assoziatives Array, das Funktionsnamen ihren Definitionen zuordnet.
Mit der promptsubstOption können Variablen in$PS1 erweitert. Bei der ersten Aufforderung werden die Variablen in dieser PS1 erweitert.
Die zsh_directory_nameFunktion ist eine spezielle Funktion, die beim Erweitern des ~fooVor- /path/to/somethingund Rücklaufs hilft . Dies wird zum Beispiel %~in der Eingabeaufforderung mit verwendet, damit Sie das aktuelle Verzeichnis /opt/myproj/proj/xanzeigen können, ~proj:xindem zsh_directory_nameSie das Mapping durchführen proj:x<=> /opt/myproj/proj/x. Dies wird auch vom DParametererweiterungsflag verwendet. Wenn man also expandiert ${(D)somevar}, wird diese zsh_directory_nameFunktion aufgerufen.
Hier verwenden wir ${(D):-}, ${:-}, das ist ${no_var:-nothing}ERWEITERT nothingwenn $no_varleer ist, so ${(D):-}zu nichts expandiert beim Telefonieren zsh_directory_name. zsh_directory_namewurde bisher definiert als:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Das heißt, bei der ersten PS1-Erweiterung (bei der ersten Eingabeaufforderung) ${(D):-}wird die promptsubstOption deaktiviert (um den Vorgang abzubrechen -o promptsubst), zsh_directory_name()undefiniert (da wir sie nur einmal ausführen möchten) $PS1und deaktiviert/path/to/file als Quelle ausgewählt.
${PS1=%m%# }wird erweitert (und zugewiesen $PS1), %m%#sofern PS1 nicht bereits definiert wurde (z. B. /path/to/filenach dem unset) und %m%#zufällig der Standardwert von ist PS1.