tandis qu'avec ZDOTDIR, vous pouvez dire zshd'interpréter un fichier appelé .zshrcdans 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 shou kshémulation, zshévalue $ENV; afin que vous puissiez ajouter emulate zshen haut de votre page /path/to/fileet 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. $functionsest un tableau associatif spécial qui mappe les noms de fonction à leurs définitions.
Avec l' promptsubstoption, les variables dans $PS1sont développées. Ainsi, à la première invite, les variables de cette PS1 seront développées.
La zsh_directory_namefonction est une fonction spéciale qui permet d'étendre le ~foovers /path/to/somethinget l'inverse. Cela est utilisé par exemple avec %~dans l'invite pour que si le répertoire courant est, /opt/myproj/proj/xvous pouvez l'afficher comme ~proj:xen faisant zsh_directory_namele mappage proj:x<=> /opt/myproj/proj/x. Cela est également utilisé par le Ddrapeau d'expansion des paramètres. Donc, si l'on se développe ${(D)somevar}, cette zsh_directory_namefonction 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_namezsh_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' promptsubstoption sera désactivée (pour annuler la -o promptsubst), zsh_directory_name()indéfinie (car nous voulons l'exécuter une seule fois) $PS1pour ne pas être définie et /path/to/filepour ê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/fileaprès le unset), et %m%#se trouve être la valeur par défaut de PS1.