Je viens de find un moyen de démarrer zsh
lorsque je démarre le bash
sur Windows à partir de
https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/ .
Il a recommandé d'append le code suivant à la fin de .bashrc
.
# Launch Zsh if [ -t 1 ]; then exec zsh fi
Que signifie [ -t 1 ]
?
Est-ce juste?
Alors, est-ce que je peux faire ça?
exec zsh
[]
est un raccourci de la command de test
.
Selon le man test
:
-t FD
Vrai si FD est un descripteur de file associé à un terminal.
Donc, si vous exécutez bash en tant que shell interactif (terminal – voir ce fil pour l'explication terminologique), bash sera remplacé par zsh.
En savoir plus sur les files .bash *:
Lorsque bash est appelé en tant que shell de connection interactif ou en tant que shell non interactif avec l'option –login , il lit et exécute d'abord les commands du file / etc / profile, si ce file existe. Après avoir lu ce file, il search ~ / .bash_profile, ~ / .bash_login et ~ / .profile, dans cet ordre, et lit et exécute les commands du premier qui existe et est lisible. L'option –noprofile peut être utilisée lorsque le shell est démarré pour empêcher ce comportement.
Lorsqu'un shell de connection se ferme , bash lit et exécute les commands des files ~ / .bash_logout et /etc/bash.bash_logout, si les files existent.
Lorsqu'un shell interactif qui n'est pas un shell de connection est démarré, bash lit et exécute les commands de ~ / .bashrc , si ce file existe. Cela peut être inhibé en utilisant l'option –norc. L'option –rcfile file forcera bash à lire et exécuter les commands à partir du file au lieu de ~ / .bashrc.
Stéphane Chazelas commente:
Notez qu'un shell peut être interactif sans stdout étant un terminal, et un shell peut être non interactif avec un terminal sur stdout (comme à chaque fois que vous exécutez un script dans un terminal sans redirect / piping sa sortie), et bash
peut lire .bashrc
même si ce n'est pas interactif (comme dans ssh host cmd
où bash
est le shell de connection de l'user sur l'hôte, ou bash --login -c 'some code'
). case $- in *i*)...
est le moyen correct de tester si un shell est interactif.
La command de test [ -t 1 ]
vérifie si la sortie de bash est sur un terminal. L'intention de cette ligne est clairement de lancer zsh lors de l'ouverture d'un terminal, sans perturber les autres utilisations de bash. Mais c'est très mal fait.
Le file .bashrc
est lu dans trois circonstances:
ssh host.example.com somecommand
et que bash est votre shell de connection sur host.example.com
). .bash_profile
un user ( le choix des files de démarrage par bash est un peu bizarre ). [ -t 1 ]
est un mauvais moyen de détecter les coquilles interactives. Il est possible, mais rare, d'exécuter bash interactivement avec la sortie standard ne va pas à un terminal. Il est plus fréquent d'avoir une sortie standard vers un terminal dans un shell non interactif; un shell non interactif n'a pas d'entreprise en cours d'exécution .bashrc
mais malheureusement bash shells invoqués par SSH. Il y a une bien meilleure façon: bash (et tout autre shell style sh) fournit une méthode embeddede et fiable pour le faire.
case $- in *i*) echo this shell is interactive;; *) echo this shell is not interactive;; esac
Donc "lancer zsh si c'est un shell interactif" devrait être écrit
case $- in *i*) exec zsh;; esac
Mais même ce n'est pas une bonne idée: cela empêche d'ouvrir un shell bash, ce qui est utile même si vous utilisez zsh. Oubliez ce blog et configurez simplement votre raccourci qui ouvre un terminal pour exécuter zsh au lieu de bash. N'installez pas les choses de sorte que "chaque fois que vous ouvrez l'application Bash sur Windows, il va maintenant démarrer avec le shell Zsh": quand vous voulez zsh, ouvrez l'application Zsh.
homme 1 test :
-t FD
le descripteur de file FD est ouvert sur un terminal
Votre exemple s'exécute (remplace le process en cours d'exécution, dans ce cas bash
) avec zsh
on si stdout est ouvert sur un terminal (pas un file / pipe / etc).