mentre con ZDOTDIR, puoi dire zshdi interpretare un file chiamato .zshrcin qualsiasi directory di tua scelta, farlo interpretare qualsiasi file di tua scelta (non necessariamente chiamato .zshrc) si rivela abbastanza difficile.
In sho kshemulazione, zshvaluta $ENV; in modo da poter aggiungere emulate zshnella parte superiore del tuo /path/to/filee fare:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Un altro approccio molto contorto potrebbe essere:
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
Quello merita una spiegazione.
${foo::=value}è un'espansione variabile che effettivamente imposta $foo . $functionsè una matrice associativa speciale che associa i nomi delle funzioni alle loro definizioni.
Con l' promptsubstopzione, le variabili in $PS1vengono espanse. Quindi, al primo prompt, le variabili in quella PS1 verranno espanse.
La zsh_directory_namefunzione è una funzione speciale che aiuta ad espandere il ~fooverso /path/to/somethinge il contrario. Questo è usato ad esempio con%~Viene nel prompt in modo che se la directory corrente è /opt/myproj/proj/xpossibile visualizzarla come ~proj:xeseguendo zsh_directory_nameil mapping proj:x<=> /opt/myproj/proj/x. Viene utilizzato anche dal Dflag di espansione dei parametri. Quindi se uno si espande ${(D)somevar}, quella zsh_directory_namefunzione verrà chiamata.
Qui, stiamo usando ${(D):-}, ${:-}cioè${no_var:-nothing} espande a nothingse $no_varè vuoto, così ${(D):-}si espande per niente durante la chiamata zsh_directory_name. zsh_directory_nameè stato precedentemente definito come:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Cioè, alla prima espansione di PS1 (al primo prompt), ${(D):-} l' promptsubstopzione verrà disattivata (per annullare la -o promptsubst), zsh_directory_name()indefinita (come vogliamo eseguirla solo una volta) $PS1per essere annullata e /path/to/filereperita.
${PS1=%m%# }si espande (e si assegna $PS1) a %m%#meno che PS1 non sia già stato definito (ad esempio da /path/to/filedopo il unset), e %m%#risulta essere il valore predefinito di PS1.