El script BASH para establecer que las variables de entorno no funcionen

137

He escrito el siguiente script para establecer algunas variables de entorno cuando sea necesario.

#!/bin/sh
export BASE=/home/develop/trees
echo $BASE
export PATH=$PATH:$BASE
echo $PATH

Debajo del comando y los resultados que puedo ver en mi terminal: el script se ejecuta, pero las variables no se establecen al final.

~$: ./script.sh
/home/develop/trees
/bin:......:/home/develop/trees
~$: echo $BASE

~$: 

Que pasa Gracias por adelantado. Mirko

MirkoZa
fuente

Respuestas:

194

exportexporta la asignación variable a procesos secundarios del shell en el que exportse ejecutó el comando. Su entorno de línea de comandos es el padre del shell del script, por lo que no ve la asignación de variables.

Puede usar el comando .(o source) bash para ejecutar los comandos de script en el entorno de shell actual y lograr lo que desea, p. Ej.

source ./script.sh
echo "$BASE"

Producirá

/home/develop/trees

El sourcecomando, que a menudo se ve en los scripts, es un sinónimo bash de ., que forma parte del estándar POSIX (por lo que .está disponible en el tablero, por ejemplo, pero sourceno lo está).

. ./script.sh     # identical to "source ./script.sh"

( . script.shy source script.shprimero buscará script.shen PATH, por lo que es más seguro especificar la ruta a script.sh).

muru
fuente
29
No necesita exportpasar variables a subcapas, una subcapa es una copia de su shell actual, incluidas las variables y funciones, etc. Las variables exportadas se copian a los nuevos procesos generados desde el shell, independientemente de que ese proceso sea otro shell o no. En segundo lugar, .es el comando POSIX para el abastecimiento. Bash agrega sourcecomo un sinónimo más legible para él, pero no puede confiar en que esté disponible en sh. Por último, en . ./scriptlugar de . scriptsi quieres evitar sorpresas. mywiki.wooledge.org/BashFAQ/060
geirha
Tenga en cuenta que si obtiene un script Y usa una tubería, el entorno de origen no está disponible para el padre. por ejemplo, 'source setit.sh' está bien. 'source setit.sh | tee setit.log' no está bien. Sorprendente. No es intuitivo
Gaoithe
10

Cuando ejecuta un script, se ejecuta en una subshell. Las variables solo son válidas dentro del contexto de esa subshell. Póngalos en su .bashrco .profiley lea sobre variables y subcapas . La exportdeclaración funciona con jerarquía inferior (shell actual y todos sus subcapas) no como en su ejemplo.

Alternativamente (si realmente desea que el script afecte el entorno de su shell actual) ejecútelo como:

. ./script.sh

Eso hace que se ejecute en su shell actual, pero tampoco pasará variables a la jerarquía.

confundir
fuente
5

A menudo quiero establecer una variable de entorno sin problemas.

Esto es lo que agrego a mi .bashrc para implementar esta conveniencia.

defect() {
    if [ $1 ] && [ -z $2 ]
    then
        eval 'export DEFECT=$1'
        return 0
    else
        echo 'Usage: defect {number}'
        return 1
    fi
}
jlettvin
fuente
-1

Puedes probar algo como esto

CURRENT_DIR=`pwd`
echo "SOME_PATH is pointing to ${CURRENT_DIR}"
#Export SOME_PATH for current working directory
export SOME_PATH=${CURRENT_DIR}
silentsudo
fuente