De las páginas 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.
por lo que debería poder establecer la variable de entorno ZDOTDIR
a un nuevo directorio para que zsh busque un conjunto diferente de archivos de puntos.
Como sugiere la página man, RCS
y GLOBAL_RCS
no son rutas a archivos rc, ya que está intentando usarlos, sino opciones que puede habilitar o deshabilitar. Entonces, por ejemplo, la bandera --rcs
habilitará el RCS
opción, lo que hace que zsh lea desde archivos rc. Puede usar los siguientes indicadores de línea de comandos para activar o desactivar RCS
o GLOBAL_RCS
:
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Para responder a su otra pregunta:
¿Es posible iniciar zsh, ejecutar "fuente/ruta/al/archivo" y luego permanecer en la misma sesión de zsh?
Sí, esto es bastante fácil de acuerdo con las instrucciones anteriores. Solo ejecuta zsh -d -f
y luego source /path/to/zshrc
.
mientras que con ZDOTDIR, puedes decirle a zsh
para interpretar un archivo llamado .zshrc
en cualquier directorio de su elección, haciendo que interprete cualquier archivo de su elección (no necesariamente llamado .zshrc
) resulta bastante difícil.
En sh
o ksh
emulación, zsh
evalúa $ENV
; por lo que podría agregar emulate zsh
en la parte superior de tu /path/to/file
y hacer:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Otro enfoque muy complicado podría ser:
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
Ese merece un poco de explicación.
${foo::=value}
es una expansión variable que en realidad establece $foo
. $functions
es una matriz asociativa especial que asigna nombres de funciones a sus definiciones.
Con el promptsubst
opción, variables en $PS1
se expanden. Entonces, en el primer aviso, las variables en esa PS1 se expandirán.
El zsh_directory_name
función es una función especial que ayuda a expandir el ~foo
a /path/to/something
y al revés Eso se usa, por ejemplo, con %~
en el aviso para que si el directorio actual es /opt/myproj/proj/x
puedes mostrarlo como ~proj:x
al tener zsh_directory_name
hacer el mapeo proj:x
<=> /opt/myproj/proj/x
. Eso también lo usa el D
indicador de expansión de parámetros. Entonces, si uno expande ${(D)somevar}
, que zsh_directory_name
se llamará a la función.
Aquí, estamos usando ${(D):-}
, ${:-}
, eso es ${no_var:-nothing}
se expande a nothing
si $no_var
está vacío, entonces ${(D):-}
se expande a nada mientras llama a zsh_directory_name
. zsh_directory_name
se ha definido previamente como:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Es decir, en la primera expansión de PS1 (en el primer aviso), ${(D):-}
causará el promptsubst
opción a desarmar (para cancelar el -o promptsubst
), zsh_directory_name()
ser indefinido (ya que queremos ejecutarlo solo una vez) $PS1
para ser desarmado, y /path/to/file
para ser fuente.
${PS1=%m%# }
expande (y asigna $PS1
) a %m%#
a menos que PS1 ya estuviera definido (por ejemplo, por /path/to/file
después del unset
) y %m%#
pasa a ser el valor predeterminado de PS1
.