ZSH Config Switching
Wenn Sie verschiedene zsh Konfiguration Frameworks (oh-my-zsh, zprezto usw.) testen wollen und zwischen ihnen wechseln, Ihre beste Wette ist mit symbolischen Links für ~/.zsh
, ~/.zshrc
, ~/.zlogin
, ~/.zlogout
, ~/.zprofile
, und ~/.zshenv
. Möglicherweise möchten Sie für jedes Framework ein Shell-Skript erstellen, um diese Symlinks für einen schnelleren Wechsel zu erstellen.
Legen Sie Ihre Framework-Konfigurationen in eigenen Ordnern ab. Für jedes Framework.
- Installieren Sie andernfalls das Framework in einem eigenen Ordner
- Wenn das Framework die Installation dazu zwingt
~/.zsh
, dann
- Schützen Sie zuerst den Strom
~/.zsh
. Entweder
- entferne den
~/.zsh
Symlink; rm ~/.zsh
, oder
- Verschiebe den
~/.zsh
Ordner.mv ~/.zsh ~/.zsh.backup
- Führen Sie das Framework-Installationsprogramm aus.
- Verschieben Sie den Framework-Ordner in ein eigenes Verzeichnis. zb
mv ~/.zsh ~/.oh-my-zsh
.
- Wiederholen Sie dies für jedes Framework.
Erstellen Sie anschließend für jedes Framework ein Shell-Skript, um die erforderlichen Symlinks zu erstellen. Hier ist ein Beispiel für zprezto, da ich es bereits benutze.
$ mkdir ~/bin
$ cat <<EOF > ~/bin/use-zprezto
#!/bin/bash
SYMLINKS=".zsh .zshrc .zshlogin .zshlogout .zshprofile .zpreztorc .zshenv .zshrc"
CONFIG_HOME="$HOME/.zprezto"
# check for unexpected error conditions
for sym in $SYMLINKS; do
# report an error and quit if $sym exists and is not a symlink
[[ -e "$HOME/$sym" -a ! -h "$HOME/$sym" ]] && { echo "error: '$HOME/$sym' is not a symlink!"; return 1; }
done
# now create the symlinks now that nothing should go wrong
for sym in $SYMLINKS; do
# remove old symlink if it exists
[[ -h "$HOME/$sym" ]] && rm -f "$HOME/$sym"
# create new symlink
ln -s "$CONFIG_HOME/$sym" "$HOME/$sym"
done
# uncomment next line to start a new zsh shell. CAUTION: each call is a zsh shell inside a zsh shell. Too many calls will put you in limbo :D
#/usr/bin/env zsh
EOF
$ chmod 700 ~/bin/use-zprezto
Dieses Skript ist ziemlich einfach und basiert auf der Tatsache, dass alle meine Symlinks nach dem gleichen Muster organisiert sind. Sie können das Entfernen kopieren und einfügen und nach der Schleife Linien für Symlinks erstellen , die nicht dem Muster folgen.
Ist das erledigt, Verwendung ~/bin/use-zprezto
--oder ~/bin/use-whatever
--to Schalter zwischen zsh Frameworks.
Beachten Sie, dass Änderungen nur in neuen zsh-Shells wirksam werden, nicht in vorhandenen Shells.
Shell-Umschaltung
Es ist ein bisschen gefährlich, aber wenn Sie so geneigt sind, können Sie einen Symlink für Ihren Shell-Befehl verwenden und den Symlink als Ihre Standard-Shell festlegen. Sie können dann der use-*
obigen Skriptmethode folgen , um Ihre Standard-Shell zu ändern.
Als Beispiel mit zsh ...
$ mkdir ~/bin
$ cat <<EOF > ~/bin/use-zsh
#!/bin/bash
# check for valid shell symlink
if [[ ! -h "$HOME/.shell" ]]; then
echo "error: $HOME/.shell is not a symlink!"
return 1
fi
# remove existing shell symlink if it exists
[[ -h "$HOME/.shell" ]] && rm -f "$HOME/.shell"
# create new shell symlink, but warn user if this fails!
if ! ln -s /usr/bin/zsh "$HOME/.shell"; then
echo "ERROR: failed to create $HOME/.shell symlink. Manually create the symlink or future logins will fail!."
return 2
fi
EOF
$ chmod 700 ~/bin/use-zsh
Dies ist gefährlich, weil Sie sich nicht unter einem Benutzer anmelden können, wenn die in gespeicherte Shell /etc/passwd
kein gültiges Programm ist. Sie können sich also aus Ihrem Konto ausschließen, wenn Sie nicht vorsichtig sind. dh Ihr ~/.shell
Symlink ist kaputt oder verweist nicht auf ein interaktives Programm. Sie können dies gerne mit einem Benutzerkonto versuchen, dies wird jedoch für Ihr root
Konto NICHT EMPFOHLEN .
Wenn Sie trotzdem fortfahren möchten, dann
$ ~/bin/use-zsh # ensures ~/.shell exists for chsh
$ echo "$HOME/.shell | sudo tee -a /etc/shells # add symlink to system's list of valid shells
$ chsh -s ~/.shell # changes default shell in /etc/passwd for $USER
zsh
? oderoh-my-zsh
? welche?