tandis qu'avec ZDOTDIR, vous pouvez dire zsh
d'interpréter un fichier appelé .zshrc
dans n'importe quel répertoire de votre choix, le faire interpréter n'importe quel fichier de votre choix (pas nécessairement appelé .zshrc
) s'avère assez difficile.
Dans sh
ou ksh
émulation, zsh
évalue $ENV
; afin que vous puissiez ajouter emulate zsh
en haut de votre page /path/to/file
et faire:
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 un peu d'explication.
${foo::=value}
est une expansion variable qui définit réellement $foo
. $functions
est un tableau associatif spécial qui mappe les noms de fonction à leurs définitions.
Avec l' promptsubst
option, les variables dans $PS1
sont développées. Ainsi, à la première invite, les variables de cette PS1 seront développées.
La zsh_directory_name
fonction est une fonction spéciale qui permet d'étendre le ~foo
vers /path/to/something
et l'inverse. Cela est utilisé par exemple avec %~
dans l'invite pour que si le répertoire courant est, /opt/myproj/proj/x
vous pouvez l'afficher comme ~proj:x
en faisant zsh_directory_name
le mappage proj:x
<=> /opt/myproj/proj/x
. Cela est également utilisé par le D
drapeau d'expansion des paramètres. Donc, si l'on se développe ${(D)somevar}
, cette zsh_directory_name
fonction sera appelée.
Ici, nous utilisons ${(D):-}
, ${:-}
qui est ${no_var:-nothing}
étend de façon à s'est vide, donc par rien tout en appelant . a été précédemment défini comme:nothing
$no_var
${(D):-}
zsh_directory_name
zsh_directory_name
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
C'est-à-dire que lors de la première extension PS1 (à la première invite), ${(D):-}
l' promptsubst
option sera désactivée (pour annuler la -o promptsubst
), zsh_directory_name()
indéfinie (car nous voulons l'exécuter une seule fois) $PS1
pour ne pas être définie et /path/to/file
pour être sourcée.
${PS1=%m%# }
se développe (et affecte $PS1
) à %m%#
moins que PS1 n'ait déjà été défini (par exemple par /path/to/file
après le unset
), et %m%#
se trouve être la valeur par défaut de PS1
.