子 caparazón y 父 caparazón (当前 caparazón) relación entre subcapa y caparazón

¡Declare solemnemente que el script de shell se ejecuta con cuidado, se ejecuta con cuidado, se ejecuta con cuidado! ! !

Primero defina las variables en el shell actual:

some_dir = / home / jiku (¡¡¡un directorio inexistente !!!)

#Comience a escribir el guión

#toque subshell.sh

#vi subshell.sh

cd $some_dir

#!/bin/bash

cd $some_dir

if [ $? -eq 0 ]; then
    rm -rf *
else
    echo 'cannot change directory!'

exit 1
fi

#chmod + x subshell.sh

#. / subshell.sh

¡Entonces fue una tragedia! ! ! !

la razón:

En circunstancias normales, el script debería informar de un error, pero

Sí./subshell modo de ejecución se basa en el shell actual y luego inicia un subshell para ejecutar este script

entonces

La variable $ some_dir no está definida en la subcapa, por lo que está vacía

#cd (vacío) volverá al directorio de inicio del usuario, el comando cd también se ejecuta con éxito, el valor de retorno es 0

Así que envié el directorio de inicio directamente. . . . . .

 

================================================ ======

Solución 1:

Definir variables en el script

cd $some_dir

#!/bin/bash
some_dir=/home/jiku
cd $some_dir

if [ $? -eq 0 ]; then
    rm -rf *
else
    echo 'cannot change directory!'

exit 1
fi

Solución 2:

# some_dir = / home / jiku

#export some_dir

Definir variables en el shell actual

Luego use el comando de exportación para establecer las variables del shell actual en variables de entorno

=========================================

conclusión:

Los atributos heredados por el Shell hijo del Shell padre son los siguientes:

               Directorio de trabajo actual

               Variable ambiental

               Entrada estándar, salida estándar y salida de error estándar

               Identificadores de todos los archivos abiertos

Propiedades que el shell hijo no puede heredar del shell padre:

Variables de shell distintas                de las variables de entorno y las variables definidas en el archivo .bashrc      (es decir, variables definidas temporalmente)

==========================================

Extracto de:

 

Hay dos formas de ejecutar Scripts en Linux, la principal diferencia es si se debe establecer un subshell

1. nombre de archivo de origen o. Nombre de archivo
no crea una subcapa, lee y ejecuta los comandos en el nombre de archivo en el entorno de shell actual, lo que equivale a ejecutar los comandos en el nombre de archivo de forma secuencial

2.
Cree una subshell con el nombre de archivo bash o ./filename , y cree una nueva subshell en el entorno bash actual para ejecutar los comandos en el nombre de archivo. La
subshell hereda las variables del shell principal, pero el subshell no puede usar las variables del shell principal a menos que se utilice la exportación.
[Observaciones: Esto es similar a los espacios de nombres, e incluso similar a las funciones en c]

Los atributos heredados por el Shell hijo del Shell padre son los siguientes:

Directorio de trabajo actual
Variables de entorno
Entrada estándar, salida estándar y salida de error estándar
Todos los identificadores de archivos abiertos
Señales ignoradas
Los atributos que el shell hijo no puede heredar del shell padre se resumen a continuación:

Las variables de shell distintas de las variables de entorno y las variables definidas en el archivo .bashrc
no se ignoran. Procesamiento de señales
3. $ (commond)
Su función es hacer que el comando se ejecute en la subshell

4. `commond` es
similar a $ (commond).
[El símbolo "` "aquí es un apóstrofe (comilla posterior), no una comilla simple, sino la tecla debajo de la tecla Esc del teclado.

5. exec commond
reemplaza el shell actual pero no crea un nuevo proceso. El pid del proceso permanece sin cambios.
Función:
El comando integrado exec del shell no iniciará un nuevo shell, sino que reemplazará el proceso de shell actual con el comando que se ejecutará y limpiará el entorno del proceso anterior y otras cosas después del comando exec. El comando ya no se ejecutará.
Después de ejecutar exec ls en un shell, el directorio actual aparecerá en la lista y luego el shell saldrá por sí mismo. (Los comandos posteriores ya no se ejecutarán)
Debido a que este shell ha sido reemplazado con un proceso que solo ejecuta el comando ls, naturalmente sale cuando finaliza la ejecución.
Cuando sea necesario, puede usar sub shell para evitar este efecto. Generalmente, coloca el comando exec en un script de shell, llama a este script con el script principal y usa bash a.sh en el punto de llamada (a.sh es el script que almacena el comando). Esto creará un sub shell para que a.sh se ejecute y, cuando se ejecute en exec, el proceso del sub script se sustituirá por el comando exec correspondiente.
————————————————
Declaración de derechos de autor: este artículo es el artículo original del blogger de CSDN "peacewind", que sigue al acuerdo de derechos de autor CC 4.0 BY-SA. Adjunte el enlace de la fuente original y esta declaración para reimprimir .
Enlace original: https://blog.csdn.net/NOStandby/article/details/82914930

 

Supongo que te gusta

Origin blog.csdn.net/Vast_Wang/article/details/106171252
Recomendado
Clasificación