GNU/Linux >> Linux Esercitazione >  >> Linux

Avvia zsh con uno zshrc personalizzato

Dalle pagine man:

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.

quindi dovresti essere in grado di impostare la variabile d'ambiente ZDOTDIR in una nuova directory per fare in modo che zsh cerchi un diverso set di dotfile.

Come suggerisce la pagina man, RCS e GLOBAL_RCS non sono percorsi per i file rc, poiché stai tentando di usarli, ma piuttosto opzioni che puoi abilitare o disabilitare. Quindi, per esempio, il flag --rcs abiliterà il RCS opzione, facendo in modo che zsh legga dai file rc. Puoi utilizzare i seguenti flag della riga di comando per zsh per abilitare o disabilitare RCS o GLOBAL_RCS :

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

Per rispondere alla tua altra domanda:

è possibile avviare zsh, eseguire "source /path/to/file", quindi rimanere nella stessa sessione zsh?

Sì, questo è abbastanza facile secondo le indicazioni di cui sopra. Basta eseguire zsh -d -f e poi source /path/to/zshrc .


mentre con ZDOTDIR, puoi dire zsh per interpretare un file chiamato .zshrc in qualsiasi directory di tua scelta, facendogli interpretare qualsiasi file di tua scelta (non necessariamente chiamato .zshrc ) risulta abbastanza difficile.

In sh o ksh emulazione, zsh valuta $ENV; quindi potresti aggiungere emulate zsh nella parte superiore del tuo /path/to/file e fai:

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 piccola spiegazione.

${foo::=value} è un'espansione variabile che effettivamente imposta $foo . $functions è uno speciale array associativo che associa i nomi delle funzioni alle loro definizioni.

Con il promptsubst opzione, variabili in $PS1 vengono espansi. Quindi, al primo prompt, le variabili in quel PS1 verranno espanse.

Il zsh_directory_name function è una funzione speciale che aiuta a espandere il ~foo a /path/to/something e viceversa. Questo è usato per esempio con %~ nel prompt in modo che se la directory corrente è /opt/myproj/proj/x puoi visualizzarlo come ~proj:x avendo zsh_directory_name eseguire la mappatura proj:x <=> /opt/myproj/proj/x . Viene utilizzato anche dal D flag di espansione dei parametri. Quindi, se si espande ${(D)somevar} , quel zsh_directory_name verrà chiamata la funzione.

Qui stiamo usando ${(D):-} , ${:-} , cioè ${no_var:-nothing} si espande in nothing se $no_var è vuoto, quindi ${(D):-} si espande a zero durante la chiamata a 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 PS1 (al primo prompt), ${(D):-} causerà il promptsubst opzione da non impostare (per annullare il -o promptsubst ), zsh_directory_name() essere indefinito (poiché vogliamo eseguirlo solo una volta) $PS1 da non impostare e /path/to/file da reperire.

${PS1=%m%# } espande (e assegna $PS1 ) a %m%# a meno che PS1 non fosse già definito (ad esempio da /path/to/file dopo il unset ) e %m%# sembra essere il valore predefinito di PS1 .


Linux
  1. Iniziare con Zsh

  2. Come crittografare i file con gocryptfs su Linux

  3. File di gatto con directory?

  4. Ordinare i file in una cartella specifica con Ranger?

  5. Ora di inizio del processo con fuso orario?

Crea file di dimensioni personalizzate in Linux

Guida introduttiva al comando Tar

Come caricare file con FileZilla

Carica file con Monsta FTP

lsof Command in Linux con esempi

Comando di comunicazione Linux con esempi