0 votes

Pourquoi bash n'est pas disponible bien qu'il soit installé ?

Mon objectif est d'exécuter un script, où la ligne shebang provoque l'utilisation de bash. D'une certaine manière, l'exécution de bash exécute toujours zsh pour moi, même si j'ai installé bash 5 en utilisant Homebrew et que Mac (10.15) est livré avec bash 3.

J'aimerais toujours que zsh soit le shell par défaut.

Mon but est d'exécuter les scripts avec bash, et les lignes shebang avec bash me donnent zsh, comme le montre la syntaxe que le scripts reconnaît. L'utilisation de -c ci-dessous est juste pour faciliter l'illustration (par rapport à un fichier avec shebang).

Voici mes tentatives pour accéder à bash et le contenu de /etc/shells

    $ /usr/local/opt/bash/bin/bash -c "echo $SHELL"
    /bin/zsh
    $ whereis bash
    /bin/bash
    $ /bin/bash -c "echo $SHELL"
    /bin/zsh
    $ /bin/bash -c 'echo $SHELL'
    /bin/zsh
    $ /usr/local/bin/bash -c "echo $SHELL"
    /bin/zsh
    $ /usr/local/bin/bash -c 'echo $SHELL'
    /bin/zsh
    $ cat /etc/shells
    # List of acceptable shells for chpass(1).
    # Ftpd will not allow users to connect who are not using
    # one of these shells.
    /usr/local/bin/bash
    /bin/bash
    /bin/csh
    /bin/dash
    /bin/ksh
    /bin/sh
    /bin/tcsh
    /bin/zsh
    $ /usr/bin/env bash -c "echo $SHELL"
    /bin/zsh
    $ /bin/bash  -c "ps -p $$"
    PID TTY           TIME CMD
    6775 9 ttys011    0:00.31 -zsh
    $/usr/local/opt/bash/bin/bash -c "ps -p $$"
    PID TTY           TIME CMD
    69799 ttys001    0:00.38 -zsh
    $ /usr/local/bin/bash -c 'ps -p $$'
    PID TTY           TIME CMD
    69985 ttys001    0:00.01 ps -p 69985
    $ /bin/bash -c "echo $0"
    -zsh
    $ /usr/local/opt/bash/bin/bash -c "echo $0"
    -zsh

Aussi, j'ai créé le fichier suivant et je l'ai exécuté directement

#!/usr/bin/env bash
# With /bin/bash on the shebang we get the same output
ps -p $$
echo $SHELL
echo $0
echo bash $BASH_VERSION
echo zsh $ZSH_VERSION

Le résultat est :

$ ./bashtest.sh
  PID TTY           TIME CMD
70188 ttys000    0:00.00 /bin/bash ./bashtest.sh
/bin/zsh
./bashtest.sh
bash 3.2.57(1)-release
zsh

3voto

yoliho Points 340

Vos exemples ne montrent pas que le shell que vous exécutez est zsh.

Ce qu'ils montrent, c'est que l'interpréteur de commandes par défaut est zsh et l'indicateur ps montre que vous avez exécuté bash à partir d'un interpréteur de commandes zsh.

Une façon de voir le shell actuel est echo $0 de https://askubuntu.com/questions/590899/how-do-i-check-which-shell-i-am-using Toutefois, cela ne fonctionne que dans certains cas. Cela fonctionne si vous appelez bash depuis zsh comme vous le faites. Cela ne fonctionne pas avec les shells non POSIX que j'utilise, par exemple fish et xonsh.

$SHELL est l'interpréteur de commandes par défaut et non celui que vous exécutez (et c'est zsh comme vous le souhaitez). Ouvrez les pages de manuel, par exemple http://man.openbsd.org/login.1 (ou lancez man login sur MacOS) $SHELL est défini par le programme de connexion. Cependant, comme indiqué dans la page de manuel, les interpréteurs de commandes peuvent faire d'autres choses et vous pouvez également (pas par défaut) lancer un interpréteur de commandes sans login dans Terminal.app et je pense que $SHELL peut également être défini.

Pour le processus, le $$ est le pid de ce que la ligne de commande voit, par exemple le shell qui exécute la ligne bash que vous avez donnée.

Pour voir cela

  1. Lancez bash, par exemple bash
  2. Dans le shell bash, exécutez maintenant ps -p $$ vous obtenez quelque chose comme

    ~ bash
     bash-5.0$ ps -p $$
      PID TTY           TIME CMD
    28098 ttys000    0:00.01 bash
    bash-5.0$ exit

~ est mon invite zsh. bash est bash 5.0 installé via macports.

1voto

nohillside Points 82672

Variables dans "" sont développés par le shell en cours d'exécution, zsh dans votre cas. Utilisez '' à la place.

1voto

glenn jackman Points 1869

$SHELL est documenté dans le bash manal comme étant votre connexion et non le shell en cours d'exécution. Je ne vois pas cette variable documentée dans le manuel de zsh du tout.

Il n'y a rien de particulièrement magique.

Mon shell de connexion est fish, et c'est ce que bash utilise si la variable n'est pas définie :

env --unset=SHELL bash -c 'echo $SHELL'    # => /usr/local/bin/fish

Si vous avez un script qui est censé s'exécuter sous bash ou zsh, alors vous pouvez vérifier si certaines variables spécifiques au shell existent :

echo "this is a bash or zsh script"
if [[ -n $BASH_VERSION ]]; then
    echo "I'm running in $BASH $BASH_VERSION"
elif [[ -n $ZSH_VERSION ]]; then
    echo "I'm running in $ZSH_NAME $ZSH_VERSION"
else
    echo "I'm running under some other POSIX-type shell"
    ps -ef | grep "$$"
fi

J'ai installé un tas de coquilles différentes :

$ zsh shell.sh
this is a bash or zsh script
I'm running in zsh 5.8

$ bash shell.sh
this is a bash or zsh script
I'm running in /usr/local/bin/bash 5.0.18(1)-release

$ sh shell.sh
this is a bash or zsh script
I'm running in /bin/sh 3.2.57(1)-release

$ dash shell.sh
this is a bash or zsh script
shell.sh: 2: [[: not found
shell.sh: 4: [[: not found
I'm running under some other shell
  502 31943 31595   0  7:03PM ttys006    0:00.01 dash shell.sh
    0 31944 31943   0  7:03PM ttys006    0:00.00 ps -ef
  502 31945 31943   0  7:03PM ttys006    0:00.00 grep 31943

$ ksh shell.sh
this is a bash or zsh script
I'm running under some other shell
  502 31952 31595   0  7:04PM ttys006    0:00.01 ksh shell.sh
    0 31953 31952   0  7:04PM ttys006    0:00.00 ps -ef
  502 31954 31952   0  7:04PM ttys006    0:00.00 grep 31952

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X