À partir des pages de manuel :
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.
vous devriez donc pouvoir définir la variable d'environnement ZDOTDIR
dans un nouveau répertoire pour que zsh recherche un autre ensemble de fichiers de points.
Comme le suggère la page de manuel, RCS
et GLOBAL_RCS
ne sont pas des chemins d'accès aux fichiers rc, car vous essayez de les utiliser, mais plutôt des options que vous pouvez activer ou désactiver. Ainsi, par exemple, le drapeau --rcs
activera le RCS
option, obligeant zsh à lire à partir des fichiers rc. Vous pouvez utiliser les indicateurs de ligne de commande suivants pour zsh pour activer ou désactiver RCS
ou GLOBAL_RCS
:
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Pour répondre à votre autre question :
est-il possible de démarrer zsh, d'exécuter "source /path/to/file", puis de rester dans la même session zsh ?
Oui, c'est assez facile selon les instructions ci-dessus. Exécutez simplement zsh -d -f
puis source /path/to/zshrc
.
tandis qu'avec ZDOTDIR, vous pouvez dire zsh
pour interpréter un fichier nommé .zshrc
dans n'importe quel répertoire de votre choix, en lui faisant interpréter n'importe quel fichier de votre choix (pas nécessairement appelé .zshrc
) s'avère assez difficile.
En sh
ou ksh
émulation, zsh
évalue $ENV
; vous pouvez donc ajouter emulate zsh
en haut de votre /path/to/file
et faites :
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Une autre approche très compliquée pourrait être :
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
Celui-là mérite une petite explication.
${foo::=value}
est une extension de variable qui définit $foo
. $functions
est un tableau associatif spécial qui associe les noms de fonctions à leurs définitions.
Avec le promptsubst
option, variables en $PS1
sont élargis. Ainsi, à la première invite, les variables de cette PS1 seront développées.
Le zsh_directory_name
function est une fonction spéciale qui aide à développer le ~foo
à /path/to/something
et l'inverse. C'est utilisé par exemple avec %~
dans l'invite de sorte que si le répertoire courant est /opt/myproj/proj/x
vous pouvez l'afficher sous la forme ~proj:x
en ayant zsh_directory_name
faire le mapping proj:x
<=> /opt/myproj/proj/x
. C'est aussi utilisé par le D
indicateur d'extension de paramètre. Donc, si l'on développe ${(D)somevar}
, que zsh_directory_name
la fonction sera appelée.
Ici, nous utilisons ${(D):-}
, ${:-}
, soit ${no_var:-nothing}
se développe en nothing
si $no_var
est vide, donc ${(D):-}
se développe à rien lors de l'appel zsh_directory_name
. zsh_directory_name
a été précédemment défini comme :
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Autrement dit, lors de la première extension PS1 (à la première invite), ${(D):-}
provoquera le promptsubst
option à désactiver (pour annuler le -o promptsubst
), zsh_directory_name()
être indéfini (car nous ne voulons l'exécuter qu'une seule fois) $PS1
à désactiver, et /path/to/file
à sourcer.
${PS1=%m%# }
développe (et attribue $PS1
) à %m%#
sauf si PS1 était déjà défini (par exemple par /path/to/file
après le unset
), et %m%#
se trouve être la valeur par défaut de PS1
.