Während mit ZDOTDIR, können Sie sagen zsh
eine Datei, die .zshrc
in 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 sh
oder ksh
Emulation, zsh
wertet aus $ENV
; so können Sie emulate zsh
am 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
.$functions
ist ein spezielles assoziatives Array, das Funktionsnamen ihren Definitionen zuordnet.
Mit der promptsubst
Option können Variablen in$PS1
erweitert. Bei der ersten Aufforderung werden die Variablen in dieser PS1 erweitert.
Die zsh_directory_name
Funktion ist eine spezielle Funktion, die beim Erweitern des ~foo
Vor- /path/to/something
und Rücklaufs hilft . Dies wird zum Beispiel %~
in der Eingabeaufforderung mit verwendet, damit Sie das aktuelle Verzeichnis /opt/myproj/proj/x
anzeigen können, ~proj:x
indem zsh_directory_name
Sie das Mapping durchführen proj:x
<=> /opt/myproj/proj/x
. Dies wird auch vom D
Parametererweiterungsflag verwendet. Wenn man also expandiert ${(D)somevar}
, wird diese zsh_directory_name
Funktion aufgerufen.
Hier verwenden wir ${(D):-}
, ${:-}
, das ist ${no_var:-nothing}
ERWEITERT nothing
wenn $no_var
leer ist, so ${(D):-}
zu nichts expandiert beim Telefonieren zsh_directory_name
. zsh_directory_name
wurde 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 promptsubst
Option deaktiviert (um den Vorgang abzubrechen -o promptsubst
), zsh_directory_name()
undefiniert (da wir sie nur einmal ausführen möchten) $PS1
und 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/file
nach dem unset
) und %m%#
zufällig der Standardwert von ist PS1
.