GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Starten Sie zsh mit einem benutzerdefinierten zshrc

Aus den Manpages:

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.

Sie sollten also in der Lage sein, die Umgebungsvariable ZDOTDIR zu setzen in ein neues Verzeichnis, um zsh dazu zu bringen, nach einem anderen Satz von dotfiles zu suchen.

Wie die Manpage vorschlägt, RCS und GLOBAL_RCS sind keine Pfade zu rc-Dateien, da Sie versuchen, sie zu verwenden, sondern Optionen, die Sie aktivieren oder deaktivieren können. Also zum Beispiel das Flag --rcs aktiviert den RCS Option, wodurch zsh aus rc-Dateien liest. Sie können die folgenden Befehlszeilen-Flags für zsh verwenden, um RCS zu aktivieren oder zu deaktivieren oder GLOBAL_RCS :

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

Um Ihre andere Frage zu beantworten:

Ist es möglich, zsh zu starten, "source /path/to/file" auszuführen und dann in derselben zsh-Sitzung zu bleiben?

Ja, das ist ziemlich einfach gemäß den obigen Anweisungen. Führen Sie einfach zsh -d -f aus und dann source /path/to/zshrc .


während Sie mit ZDOTDIR zsh sagen können um eine Datei namens .zshrc zu interpretieren in einem beliebigen Verzeichnis Ihrer Wahl, indem es eine beliebige Datei Ihrer Wahl (nicht unbedingt .zshrc genannt) interpretieren lässt ) erweist sich als recht schwierig.

In sh oder ksh Emulation, zsh wertet $ENV aus; Sie könnten also emulate zsh hinzufügen oben auf Ihrem /path/to/file und tun:

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

Ein weiterer sehr komplizierter Ansatz könnte sein:

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

Das verdient eine kleine Erklärung.

${foo::=value} ist eine Variablenerweiterung, die tatsächlich setzt $foo . $functions ist ein spezielles assoziatives Array, das Funktionsnamen ihren Definitionen zuordnet.

Mit dem promptsubst Option, Variablen in $PS1 werden erweitert. Bei der ersten Eingabeaufforderung werden also die Variablen in diesem PS1 erweitert.

Die zsh_directory_name Funktion ist eine spezielle Funktion, die hilft, den ~foo zu erweitern bis /path/to/something und umgekehrt. Das wird zum Beispiel mit %~ verwendet in der Eingabeaufforderung so, dass wenn das aktuelle Verzeichnis /opt/myproj/proj/x ist Sie können es als ~proj:x anzeigen indem Sie zsh_directory_name haben Führen Sie die Zuordnung proj:x durch <=> /opt/myproj/proj/x . Das wird auch von D verwendet Parameter-Erweiterungs-Flag. Erweitert man also ${(D)somevar} , das zsh_directory_name Funktion wird aufgerufen.

Hier verwenden wir ${(D):-} , ${:-} , das ist ${no_var:-nothing} erweitert sich zu nothing wenn $no_var ist leer, also ${(D):-} wird beim Aufruf von zsh_directory_name zu nichts erweitert . zsh_directory_name wurde zuvor definiert als:

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

Das heißt, bei der ersten PS1-Erweiterung (bei der ersten Eingabeaufforderung) ${(D):-} wird den promptsubst verursachen Option nicht gesetzt werden (um den -o promptsubst abzubrechen ), zsh_directory_name() undefiniert sein (da wir es nur einmal ausführen wollen) $PS1 nicht gesetzt werden soll, und /path/to/file zu beschaffen.

${PS1=%m%# } expandiert (und weist $PS1 zu ) zu %m%# es sei denn, PS1 wurde bereits definiert (z. B. durch /path/to/file nach unset ) und %m%# zufällig der Standardwert von PS1 .


Linux
  1. Erste Schritte mit Zsh

  2. So verschlüsseln Sie Dateien mit gocryptfs unter Linux

  3. Cat-Dateien mit Verzeichnis?

  4. PDF-Dateien optimieren (mit Ghostscript oder anderen)

  5. Docker-Befehle hängen ohne Antwort

Erstellen Sie Dateien mit benutzerdefinierter Größe in Linux

Erste Schritte mit dem Tar-Befehl

So laden Sie Dateien mit FileZilla hoch

Laden Sie Dateien mit Monsta FTP hoch

lsof-Befehl unter Linux mit Beispielen

Linux-Comm-Befehl mit Beispielen