Comutação de configurações ZSH
Se você quiser testar diferentes estruturas de configuração zsh (oh-my-zsh, zprezto, etc) e alternar entre elas, sua melhor opção é usar links simbólicos para ~/.zsh
, ~/.zshrc
, ~/.zlogin
, ~/.zlogout
, ~/.zprofile
e ~/.zshenv
. Você pode querer criar um shell scripts para cada framework para criar esses links simbólicos para troca mais rápida.
Coloque suas configurações de estrutura em suas próprias pastas. Para cada estrutura.
- Instale a estrutura em sua própria pasta, se possível, caso contrário
- Se o framework força a instalação para
~/.zsh
, então
- Protege o atual
~/.zsh
primeiro. Ou
- remova o link simbólico
~/.zsh
; rm ~/.zsh
ou
- mova a pasta
~/.zsh
; %código%
- Execute o instalador da estrutura.
- Mova a pasta da estrutura para seu próprio diretório. por exemplo.
mv ~/.zsh ~/.zsh.backup
.
- Repita para cada estrutura.
Uma vez feito, crie um script de shell para cada framework para criar os links simbólicos necessários. Aqui está um exemplo para o zprezto, já que eu já o uso.
$ 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
Esse script é bastante simples e depende do fato de que todos os meus links simbólicos estão organizados com o mesmo padrão. Você pode copiar e colar as linhas remove e create depois do loop de links simbólicos que você não segue o padrão.
Uma vez feito, use mv ~/.zsh ~/.oh-my-zsh
- ou ~/bin/use-zprezto
- para alternar entre as estruturas zsh.
Observe que as alterações só têm efeito em novas shells, não em shells existentes.
Troca de shell
É um pouco perigoso, mas se você estiver inclinado, você pode usar um link simbólico para o seu comando shell e definir o symlink como seu shell padrão. Você pode seguir o método de script ~/bin/use-whatever
acima para alterar seu shell padrão.
Como um exemplo com 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
O motivo pelo qual isso é perigoso é que você não pode fazer login sob um usuário se o shell armazenado em use-*
não for um programa válido. Assim, você pode se proteger da sua conta se não for cuidadoso; ou seja, seu link simbólico /etc/passwd
está quebrado ou não aponta para um programa interativo. Você pode tentar isso com uma conta de usuário, mas isso NÃO É RECOMENDADO para sua conta ~/.shell
.
Se você ainda quiser continuar,
$ ~/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