Aus den Manpages:
STARTUP/SHUTDOWN FILES
Commands are first read from /etc/zshenv; this cannot be overridden. Subsequent be‐
haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
files, while the second only affects global startup files (those shown here with an
path starting with a /). If one of the options is unset at any point, any subsequent
startup file(s) of the corresponding type will not be read. It is also possible for
a file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by
default.
Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, com‐
mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is
interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc. Finally, if
the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.
When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
This happens with either an explicit exit via the exit or logout commands, or an
implicit exit by reading end-of-file from the terminal. However, if the shell termi‐
nates due to exec'ing another process, the logout files are not read. These are also
affected by the RCS and GLOBAL_RCS options. Note also that the RCS option affects
the saving of history files, i.e. if RCS is unset when the shell exits, no history
file will be saved.
If ZDOTDIR is unset, HOME is used instead. Files listed above as being in /etc may
be in another directory, depending on the installation.
As /etc/zshenv is run for all instances of zsh, it is important that it be kept as
small as possible. In particular, it is a good idea to put code that does not need
to be run for every single shell behind a test of the form `if [[ -o rcs ]]; then
...' so that it will not be executed when zsh is invoked with the `-f' option.
Sie sollten also in der Lage sein, die Umgebungsvariable ZDOTDIR
zu setzen in ein neues Verzeichnis, um zsh dazu zu bringen, nach einem anderen Satz von dotfiles zu suchen.
Wie die Manpage vorschlägt, RCS
und GLOBAL_RCS
sind keine Pfade zu rc-Dateien, da Sie versuchen, sie zu verwenden, sondern Optionen, die Sie aktivieren oder deaktivieren können. Also zum Beispiel das Flag --rcs
aktiviert den RCS
Option, wodurch zsh aus rc-Dateien liest. Sie können die folgenden Befehlszeilen-Flags für zsh verwenden, um RCS
zu aktivieren oder zu deaktivieren oder GLOBAL_RCS
:
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Um Ihre andere Frage zu beantworten:
Ist es möglich, zsh zu starten, "source /path/to/file" auszuführen und dann in derselben zsh-Sitzung zu bleiben?
Ja, das ist ziemlich einfach gemäß den obigen Anweisungen. Führen Sie einfach zsh -d -f
aus und dann source /path/to/zshrc
.
während Sie mit ZDOTDIR zsh
sagen können um eine Datei namens .zshrc
zu interpretieren in einem beliebigen Verzeichnis Ihrer Wahl, indem es eine beliebige Datei Ihrer Wahl (nicht unbedingt .zshrc
genannt) interpretieren lässt ) erweist sich als recht schwierig.
In sh
oder ksh
Emulation, zsh
wertet $ENV
aus; Sie könnten also emulate zsh
hinzufügen oben auf Ihrem /path/to/file
und tun:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Ein weiterer 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 kleine Erklärung.
${foo::=value}
ist eine Variablenerweiterung, die tatsächlich setzt $foo
. $functions
ist ein spezielles assoziatives Array, das Funktionsnamen ihren Definitionen zuordnet.
Mit dem promptsubst
Option, Variablen in $PS1
werden erweitert. Bei der ersten Eingabeaufforderung werden also die Variablen in diesem PS1 erweitert.
Die zsh_directory_name
Funktion ist eine spezielle Funktion, die hilft, den ~foo
zu erweitern bis /path/to/something
und umgekehrt. Das wird zum Beispiel mit %~
verwendet in der Eingabeaufforderung so, dass wenn das aktuelle Verzeichnis /opt/myproj/proj/x
ist Sie können es als ~proj:x
anzeigen indem Sie zsh_directory_name
haben Führen Sie die Zuordnung proj:x
durch <=> /opt/myproj/proj/x
. Das wird auch von D
verwendet Parameter-Erweiterungs-Flag. Erweitert man also ${(D)somevar}
, das zsh_directory_name
Funktion wird aufgerufen.
Hier verwenden wir ${(D):-}
, ${:-}
, das ist ${no_var:-nothing}
erweitert sich zu nothing
wenn $no_var
ist leer, also ${(D):-}
wird beim Aufruf von zsh_directory_name
zu nichts erweitert . zsh_directory_name
wurde zuvor 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 den promptsubst
verursachen Option nicht gesetzt werden (um den -o promptsubst
abzubrechen ), zsh_directory_name()
undefiniert sein (da wir es nur einmal ausführen wollen) $PS1
nicht gesetzt werden soll, und /path/to/file
zu beschaffen.
${PS1=%m%# }
expandiert (und weist $PS1
zu ) zu %m%#
es sei denn, PS1 wurde bereits definiert (z. B. durch /path/to/file
nach unset
) und %m%#
zufällig der Standardwert von PS1
.