Que vérifie ?

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 cmdbash 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:

  • Lorsque bash est exécuté en tant que shell interactif, c'est-à-dire qu'il exécute des commands tapées par l'user plutôt que d'exécuter des commands par lots.
  • Lorsque bash est un shell non interactif qui est exécuté par un démon RSH ou SSH (généralement parce que vous exécutez ssh host.example.com somecommand et que bash est votre shell de connection sur host.example.com ).
  • Quand il est invoqué explicitement, par exemple dans le .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).