GNU/Linux >> Belajar Linux >  >> Linux

Mulai zsh dengan zshrc khusus

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 .


Linux
  1. Memulai dengan Zsh

  2. Cara mengenkripsi file dengan gocryptfs di Linux

  3. Optimalkan file PDF (dengan Ghostscript atau lainnya)

  1. File Cat Dengan Direktori?

  2. Urutkan File Dalam Folder Tertentu Dengan Ranger?

  3. Proses Waktu Mulai Dengan Zona Waktu?

  1. Cadangkan file Anda dengan rsync

  2. Bekerja dengan file ZIP di Linux

  3. Perintah Docker menggantung tanpa respons