mientras que con ZDOTDIR, puede indicar zsh
que interprete un archivo llamado .zshrc
en cualquier directorio de su elección, hacer 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
; para que puedas 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 puede 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 realmente establece $foo
. $functions
es una matriz asociativa especial que asigna nombres de funciones a sus definiciones.
Con la promptsubst
opción, las variables $PS1
se expanden. Entonces, en el primer aviso, las variables en esa PS1 se expandirán.
La zsh_directory_name
función es una función especial que ayuda a expandir ay ~foo
al /path/to/something
revés. Que se utiliza, por ejemplo, con %~
la pronta por lo que si el directorio actual es /opt/myproj/proj/x
que puede mostrarlo como ~proj:x
por tener zsh_directory_name
hacer el mapeo proj:x
<=> /opt/myproj/proj/x
. Eso también lo usa la D
bandera de expansión de parámetros. Entonces, si uno se expande ${(D)somevar}
, esa zsh_directory_name
función se llamará.
Aquí, estamos usando ${(D):-}
, ${:-}
que se ${no_var:-nothing}
expande a nothing
si $no_var
está vacío, por lo que se ${(D):-}
expande a nada mientras se llama 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):-}
hará que la promptsubst
opción se desactive (para cancelar -o promptsubst
), zsh_directory_name()
que no esté definida (ya que queremos ejecutarla solo una vez), $PS1
que no se establezca y /path/to/file
que se obtenga.
${PS1=%m%# }
se expande (y se asigna $PS1
) a %m%#
menos que PS1 ya esté definido (por ejemplo, /path/to/file
después de unset
), y %m%#
resulta ser el valor predeterminado de PS1
.