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
.