Z manuálových stránek:
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.
takže byste měli být schopni nastavit proměnnou prostředí ZDOTDIR do nového adresáře, aby zsh hledal jinou sadu dotfiles.
Jak naznačuje manuálová stránka, RCS a GLOBAL_RCS nejsou cesty k souborům rc, jak se je pokoušíte použít, ale spíše možnosti, které můžete povolit nebo zakázat. Takže například příznak --rcs povolí RCS způsobí, že zsh bude číst z rc souborů. K aktivaci nebo deaktivaci RCS můžete použít následující příznaky příkazového řádku pro zsh nebo GLOBAL_RCS :
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Odpověď na vaši další otázku:
je možné spustit zsh, spustit "zdroj /cesta/k/souboru" a poté zůstat ve stejné relaci zsh?
Ano, podle výše uvedených pokynů je to docela snadné. Stačí spustit zsh -d -f a poté source /path/to/zshrc .
zatímco se ZDOTDIR můžete říct zsh interpretovat soubor s názvem .zshrc v libovolném adresáři podle vašeho výběru a nechat jej interpretovat libovolný soubor podle vašeho výběru (nemusí se nutně nazývat .zshrc ) je docela obtížné.
V sh nebo ksh emulace, zsh vyhodnotí $ENV; takže můžete přidat emulate zsh v horní části vašeho /path/to/file a udělejte:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Další velmi spletitý přístup by mohl být:
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
To si zaslouží trochu vysvětlení.
${foo::=value} je proměnná expanze, která ve skutečnosti nastavuje $foo . $functions je speciální asociativní pole, které mapuje názvy funkcí na jejich definice.
Pomocí promptsubst možnost, proměnné v $PS1 jsou rozšířeny. Takže po první výzvě budou proměnné v tomto PS1 rozšířeny.
zsh_directory_name function je speciální funkce, která pomáhá rozšířit ~foo na /path/to/something a naopak. To se používá například s %~ ve výzvě, takže pokud je aktuální adresář /opt/myproj/proj/x můžete jej zobrazit jako ~proj:x pomocí zsh_directory_name proveďte mapování proj:x <=> /opt/myproj/proj/x . To také používá D příznak rozšíření parametru. Pokud tedy jeden rozšíří ${(D)somevar} , tedy zsh_directory_name funkce bude volána.
Zde používáme ${(D):-} , ${:-} , to je ${no_var:-nothing} expanduje na nothing pokud $no_var je prázdný, takže ${(D):-} expanduje na nic při volání zsh_directory_name . zsh_directory_name byl dříve definován jako:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
To znamená, že při prvním rozšíření PS1 (po první výzvě) ${(D):-} způsobí promptsubst možnost deaktivovat (pro zrušení -o promptsubst ), zsh_directory_name() být undefined (protože jej chceme spustit pouze jednou) $PS1 zrušte nastavení a /path/to/file k získání.
${PS1=%m%# } expanduje (a přiřadí $PS1 ) na %m%# pokud již nebyl definován PS1 (například /path/to/file za unset ) a %m%# stane se výchozí hodnotou PS1 .