mentre con ZDOTDIR, puoi dire zsh
di interpretare un file chiamato .zshrc
in qualsiasi directory di tua scelta, farlo interpretare qualsiasi file di tua scelta (non necessariamente chiamato .zshrc
) si rivela abbastanza difficile.
In sh
o ksh
emulazione, zsh
valuta $ENV
; in modo da poter aggiungere emulate zsh
nella parte superiore del tuo /path/to/file
e 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' promptsubst
opzione, le variabili in $PS1
vengono espanse. Quindi, al primo prompt, le variabili in quella PS1 verranno espanse.
La zsh_directory_name
funzione è una funzione speciale che aiuta ad espandere il ~foo
verso /path/to/something
e il contrario. Questo è usato ad esempio con%~
Viene nel prompt in modo che se la directory corrente è /opt/myproj/proj/x
possibile visualizzarla come ~proj:x
eseguendo zsh_directory_name
il mapping proj:x
<=> /opt/myproj/proj/x
. Viene utilizzato anche dal D
flag di espansione dei parametri. Quindi se uno si espande ${(D)somevar}
, quella zsh_directory_name
funzione verrà chiamata.
Qui, stiamo usando ${(D):-}
, ${:-}
cioè${no_var:-nothing}
espande a nothing
se $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' promptsubst
opzione verrà disattivata (per annullare la -o promptsubst
), zsh_directory_name()
indefinita (come vogliamo eseguirla solo una volta) $PS1
per essere annullata e /path/to/file
reperita.
${PS1=%m%# }
si espande (e si assegna $PS1
) a %m%#
meno che PS1 non sia già stato definito (ad esempio da /path/to/file
dopo il unset
), e %m%#
risulta essere il valore predefinito di PS1
.