0 votos

¿Por qué no está disponible bash aunque esté instalado?

Mi objetivo es ejecutar un script, donde la línea shebang hace que se utilice bash. De alguna manera, al ejecutar bash siempre se ejecuta zsh para mí, a pesar de que instalé bash 5 usando Homebrew y Mac (10.15) viene con bash 3.

Todavía me gustaría que zsh fuera el shell por defecto.

Mi objetivo es ejecutar scripts con bash, y las líneas shebang con bash me dan zsh, como muestra la sintaxis que reconoce el scriptsscriptscripts. El uso de -c La siguiente es sólo para facilitar la ilustración (en comparación con un archivo con shebang).

Aquí están mis intentos de acceder a bash y al contenido 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

Además, he creado el siguiente archivo y lo he ejecutado directamente

#!/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

El resultado es:

$ ./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 Puntos 340

Tus ejemplos no muestran que el shell que estás ejecutando es zsh.

Lo que muestran es que el shell por defecto es zsh y el ps muestra que ejecutaste bash desde dentro de un shell zsh.

Una forma de ver el shell actual es echo $0 de https://askubuntu.com/questions/590899/how-do-i-check-which-shell-i-am-using Sin embargo, esto sólo funciona en algunos casos. Funciona si llamas a bash desde zsh como estás haciendo. No funciona en los shells no POSIX que uso, por ejemplo, fish y xonsh

$SHELL es el shell por defecto y no lo que se está ejecutando (y que es zsh como se quiere) login man pages e.g. http://man.openbsd.org/login.1 (o ejecute man login en MacOS) $SHELL es establecido por el programa de login . Sin embargo, como se indica en la página del manual, los shells pueden hacer otras cosas y también se puede (no por defecto) ejecutar un shell que no sea de inicio de sesión en Terminal.app y creo que también podría tener $SHELL establecido

Para el proceso, el $$ es el pid de lo que ve la línea de comandos, por ejemplo, el shell que ejecuta la línea bash que has dado.

Para ver esto

  1. Iniciar bash, por ejemplo bash
  2. En el shell bash ejecuta ahora ps -p $$ se obtiene algo así como

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

~ es mi prompt de zsh. bash es bash 5.0 instalado vía macports

1voto

Variables en "" se expanden por el shell que se está ejecutando, zsh en su caso. Utilice '' en su lugar.

1voto

Mark Puntos 6

$SHELL está documentado en el bash manal como si fuera su acceso shell, no el shell que se está ejecutando actualmente. No veo esa variable documentada en el manual de zsh en absoluto.

No hay nada especialmente mágico en ello.

Mi shell de inicio de sesión es fish, y eso es lo que bash establece si la variable no está establecida:

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

Si tienes un script que se supone que debe ejecutarse bajo bash o zsh, entonces puedes comprobar si existen ciertas variables específicas del shell:

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

Tengo un montón de conchas diferentes instaladas:

$ 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

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X