Dari halaman manual:
STARTUP/SHUTDOWN FILES
Commands are first read from /etc/zshenv; this cannot be overridden. Subsequent be‐
haviour is modified by the RCS and GLOBAL_RCS options; the former affects all startup
files, while the second only affects global startup files (those shown here with an
path starting with a /). If one of the options is unset at any point, any subsequent
startup file(s) of the corresponding type will not be read. It is also possible for
a file in $ZDOTDIR to re-enable GLOBAL_RCS. Both RCS and GLOBAL_RCS are set by
default.
Commands are then read from $ZDOTDIR/.zshenv. If the shell is a login shell, com‐
mands are read from /etc/zprofile and then $ZDOTDIR/.zprofile. Then, if the shell is
interactive, commands are read from /etc/zshrc and then $ZDOTDIR/.zshrc. Finally, if
the shell is a login shell, /etc/zlogin and $ZDOTDIR/.zlogin are read.
When a login shell exits, the files $ZDOTDIR/.zlogout and then /etc/zlogout are read.
This happens with either an explicit exit via the exit or logout commands, or an
implicit exit by reading end-of-file from the terminal. However, if the shell termi‐
nates due to exec'ing another process, the logout files are not read. These are also
affected by the RCS and GLOBAL_RCS options. Note also that the RCS option affects
the saving of history files, i.e. if RCS is unset when the shell exits, no history
file will be saved.
If ZDOTDIR is unset, HOME is used instead. Files listed above as being in /etc may
be in another directory, depending on the installation.
As /etc/zshenv is run for all instances of zsh, it is important that it be kept as
small as possible. In particular, it is a good idea to put code that does not need
to be run for every single shell behind a test of the form `if [[ -o rcs ]]; then
...' so that it will not be executed when zsh is invoked with the `-f' option.
jadi Anda harus dapat mengatur variabel lingkungan ZDOTDIR
ke direktori baru agar zsh dapat mencari kumpulan dotfile yang berbeda.
Seperti yang disarankan halaman manual, RCS
dan GLOBAL_RCS
bukan jalur ke file rc, saat Anda mencoba menggunakannya, melainkan opsi yang dapat Anda aktifkan atau nonaktifkan. Jadi, misalnya, flag --rcs
akan mengaktifkan RCS
opsi, menyebabkan zsh membaca dari file rc. Anda dapat menggunakan flag baris perintah berikut ke zsh untuk mengaktifkan atau menonaktifkan RCS
atau GLOBAL_RCS
:
--globalrcs
--rcs
-d equivalent to --no-globalrcs
-f equivalent to --no-rcs
Untuk menjawab pertanyaan Anda yang lain:
apakah mungkin untuk memulai zsh, jalankan "sumber /path/ke/file", lalu tetap di sesi zsh yang sama?
Ya, ini cukup mudah sesuai petunjuk di atas. Jalankan saja zsh -d -f
lalu source /path/to/zshrc
.
sedangkan dengan ZDOTDIR, Anda dapat membedakan zsh
untuk menafsirkan file bernama .zshrc
di direktori mana pun yang Anda pilih, minta ia menginterpretasikan file apa pun yang Anda pilih (tidak harus disebut .zshrc
) terbukti cukup sulit.
Di sh
atau ksh
emulasi, zsh
mengevaluasi $ENV
; sehingga Anda dapat menambahkan emulate zsh
di bagian atas /path/to/file
Anda dan lakukan:
ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'
Pendekatan lain yang sangat berbelit-belit bisa berupa:
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
Yang itu layak mendapat sedikit penjelasan.
${foo::=value}
adalah perluasan variabel yang sebenarnya mengatur $foo
. $functions
adalah larik asosiatif khusus yang memetakan nama fungsi ke definisinya.
Dengan promptsubst
opsi, variabel di $PS1
diperluas. Jadi, setelah permintaan pertama, variabel di PS1 tersebut akan diperluas.
zsh_directory_name
function adalah fungsi khusus yang membantu memperluas ~foo
ke /path/to/something
dan sebaliknya. Itu digunakan misalnya dengan %~
di prompt sehingga jika direktori saat ini adalah /opt/myproj/proj/x
Anda dapat menampilkannya sebagai ~proj:x
dengan memiliki zsh_directory_name
lakukan pemetaan proj:x
<=> /opt/myproj/proj/x
. Itu juga digunakan oleh D
bendera ekspansi parameter. Jadi jika seseorang memperluas ${(D)somevar}
, bahwa zsh_directory_name
fungsi akan dipanggil.
Di sini, kami menggunakan ${(D):-}
, ${:-}
, yaitu ${no_var:-nothing}
diperluas ke nothing
jika $no_var
kosong, jadi ${(D):-}
tidak meluas saat memanggil zsh_directory_name
. zsh_directory_name
sebelumnya telah didefinisikan sebagai:
zsh_directory_name() {
set +o promptsubst
unset -f zsh_directory_name
unset PS1; . /path/to/file
}
Yaitu, setelah ekspansi PS1 pertama (pada prompt pertama), ${(D):-}
akan menyebabkan promptsubst
opsi untuk tidak disetel (untuk membatalkan -o promptsubst
), zsh_directory_name()
menjadi tidak terdefinisi (karena kami ingin menjalankannya hanya sekali) $PS1
untuk tidak disetel, dan /path/to/file
untuk dijadikan sumber.
${PS1=%m%# }
memperluas (dan menetapkan $PS1
) ke %m%#
kecuali PS1 sudah ditentukan (misalnya dengan /path/to/file
setelah unset
), dan %m%#
kebetulan merupakan nilai default dari PS1
.