bash – ¿Cómo puedo detectar si estoy en una subcapa?

Pregunta:

Estoy tratando de escribir una función para reemplazar la funcionalidad de la exit incorporada para evitar salir de la terminal.

SHLVL usar la variable de entorno SHLVL pero no parece cambiar dentro de las subcapas:

$ echo $SHLVL
1
$ ( echo $SHLVL )
1
$ bash -c 'echo $SHLVL'
2

Mi función es la siguiente:

exit () {
    if [[ $SHLVL -eq 1 ]]; then
        printf '%s\n' "Nice try!" >&2
    else
        command exit
    fi
}

Sin embargo, esto no me permitirá usar la exit dentro de las subcapas:

$ exit
Nice try!
$ (exit)
Nice try!

¿Cuál es un buen método para detectar si estoy o no en una subcapa?

Respuesta:

En bash, puedes comparar $BASHPID con $$

$ ( if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi )
subshell
$   if [ "$$" -eq "$BASHPID" ]; then echo not subshell; else echo subshell; fi
not subshell

Si no está en bash, $$ debería permanecer igual en una subcapa, por lo que necesitaría alguna otra forma de obtener su ID de proceso real.

Una forma de obtener su pid real es sh -c 'echo $PPID' . Si lo pone en un simple ( … ) puede parecer que no funciona, ya que su shell ha optimizado la bifurcación. Pruebe comandos adicionales sin ( : ; sh -c 'echo $PPID'; : ) para que piense que la subcapa es demasiado complicada para optimizarla. El crédito es para John1024 en Stack Overflow por ese enfoque.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım