Dalle pagine man:
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.
quindi dovresti essere in grado di impostare la variabile d'ambiente ZDOTDIR
in una nuova directory per fare in modo che zsh cerchi un diverso set di dotfile.
Come suggerisce la pagina man, RCS
e GLOBAL_RCS
non sono percorsi per i file rc, poiché stai tentando di usarli, ma piuttosto opzioni che puoi abilitare o disabilitare. Quindi, per esempio, il flag --rcs
abiliterà il RCS
opzione, facendo in modo che zsh legga dai file rc. Puoi utilizzare i seguenti flag della riga di comando per zsh per abilitare o disabilitare RCS
o GLOBAL_RCS
:
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Per rispondere alla tua altra domanda:
è possibile avviare zsh, eseguire "source /path/to/file", quindi rimanere nella stessa sessione zsh?
Sì, questo è abbastanza facile secondo le indicazioni di cui sopra. Basta eseguire zsh -d -f
e poi source /path/to/zshrc
.
mentre con ZDOTDIR, puoi dire zsh
per interpretare un file chiamato .zshrc
in qualsiasi directory di tua scelta, facendogli interpretare qualsiasi file di tua scelta (non necessariamente chiamato .zshrc
) risulta abbastanza difficile.
In sh
o ksh
emulazione, zsh
valuta $ENV
; quindi potresti aggiungere emulate zsh
nella parte superiore del tuo /path/to/file
e fai:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Un altro approccio molto contorto potrebbe essere:
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
Quello merita una piccola spiegazione.
${foo::=value}
è un'espansione variabile che effettivamente imposta $foo
. $functions
è uno speciale array associativo che associa i nomi delle funzioni alle loro definizioni.
Con il promptsubst
opzione, variabili in $PS1
vengono espansi. Quindi, al primo prompt, le variabili in quel PS1 verranno espanse.
Il zsh_directory_name
function è una funzione speciale che aiuta a espandere il ~foo
a /path/to/something
e viceversa. Questo è usato per esempio con %~
nel prompt in modo che se la directory corrente è /opt/myproj/proj/x
puoi visualizzarlo come ~proj:x
avendo zsh_directory_name
eseguire la mappatura proj:x
<=> /opt/myproj/proj/x
. Viene utilizzato anche dal D
flag di espansione dei parametri. Quindi, se si espande ${(D)somevar}
, quel zsh_directory_name
verrà chiamata la funzione.
Qui stiamo usando ${(D):-}
, ${:-}
, cioè ${no_var:-nothing}
si espande in nothing
se $no_var
è vuoto, quindi ${(D):-}
si espande a zero durante la chiamata a zsh_directory_name
. zsh_directory_name
è stato precedentemente definito come:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Cioè, alla prima espansione PS1 (al primo prompt), ${(D):-}
causerà il promptsubst
opzione da non impostare (per annullare il -o promptsubst
), zsh_directory_name()
essere indefinito (poiché vogliamo eseguirlo solo una volta) $PS1
da non impostare e /path/to/file
da reperire.
${PS1=%m%# }
espande (e assegna $PS1
) a %m%#
a meno che PS1 non fosse già definito (ad esempio da /path/to/file
dopo il unset
) e %m%#
sembra essere il valore predefinito di PS1
.