GNU/Linux >> Znalost Linux >  >> Linux

Spusťte zsh pomocí vlastního zshrc

Z manuálových stránek:

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.

takže byste měli být schopni nastavit proměnnou prostředí ZDOTDIR do nového adresáře, aby zsh hledal jinou sadu dotfiles.

Jak naznačuje manuálová stránka, RCS a GLOBAL_RCS nejsou cesty k souborům rc, jak se je pokoušíte použít, ale spíše možnosti, které můžete povolit nebo zakázat. Takže například příznak --rcs povolí RCS způsobí, že zsh bude číst z rc souborů. K aktivaci nebo deaktivaci RCS můžete použít následující příznaky příkazového řádku pro zsh nebo GLOBAL_RCS :

  --globalrcs
  --rcs
  -d    equivalent to --no-globalrcs
  -f    equivalent to --no-rcs

Odpověď na vaši další otázku:

je možné spustit zsh, spustit "zdroj /cesta/k/souboru" a poté zůstat ve stejné relaci zsh?

Ano, podle výše uvedených pokynů je to docela snadné. Stačí spustit zsh -d -f a poté source /path/to/zshrc .


zatímco se ZDOTDIR můžete říct zsh interpretovat soubor s názvem .zshrc v libovolném adresáři podle vašeho výběru a nechat jej interpretovat libovolný soubor podle vašeho výběru (nemusí se nutně nazývat .zshrc ) je docela obtížné.

V sh nebo ksh emulace, zsh vyhodnotí $ENV; takže můžete přidat emulate zsh v horní části vašeho /path/to/file a udělejte:

ssh -t host 'zsh -c "ARGV0=sh ENV=/path/to/file exec zsh"'

Další velmi spletitý přístup by mohl být:

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

To si zaslouží trochu vysvětlení.

${foo::=value} je proměnná expanze, která ve skutečnosti nastavuje $foo . $functions je speciální asociativní pole, které mapuje názvy funkcí na jejich definice.

Pomocí promptsubst možnost, proměnné v $PS1 jsou rozšířeny. Takže po první výzvě budou proměnné v tomto PS1 rozšířeny.

zsh_directory_name function je speciální funkce, která pomáhá rozšířit ~foo na /path/to/something a naopak. To se používá například s %~ ve výzvě, takže pokud je aktuální adresář /opt/myproj/proj/x můžete jej zobrazit jako ~proj:x pomocí zsh_directory_name proveďte mapování proj:x <=> /opt/myproj/proj/x . To také používá D příznak rozšíření parametru. Pokud tedy jeden rozšíří ${(D)somevar} , tedy zsh_directory_name funkce bude volána.

Zde používáme ${(D):-} , ${:-} , to je ${no_var:-nothing} expanduje na nothing pokud $no_var je prázdný, takže ${(D):-} expanduje na nic při volání zsh_directory_name . zsh_directory_name byl dříve definován jako:

zsh_directory_name() {
  set +o promptsubst
  unset -f zsh_directory_name
  unset PS1; . /path/to/file
}

To znamená, že při prvním rozšíření PS1 (po první výzvě) ${(D):-} způsobí promptsubst možnost deaktivovat (pro zrušení -o promptsubst ), zsh_directory_name() být undefined (protože jej chceme spustit pouze jednou) $PS1 zrušte nastavení a /path/to/file k získání.

${PS1=%m%# } expanduje (a přiřadí $PS1 ) na %m%# pokud již nebyl definován PS1 (například /path/to/file za unset ) a %m%# stane se výchozí hodnotou PS1 .


Linux
  1. Začínáme se Zsh

  2. Jak šifrovat soubory pomocí gocryptfs na Linuxu

  3. Seřadit soubory v konkrétní složce pomocí Ranger?

  1. Čas zahájení procesu s časovým pásmem?

  2. Zálohujte své soubory pomocí rsync

  3. Práce se soubory ZIP v Linuxu

  1. Optimalizujte soubory PDF (pomocí Ghostscriptu nebo jiného)

  2. Příkazy Dockeru visí bez odezvy

  3. najít soubory s nastavenými seznamy ACL