Script de Shell para establecer variables de entorno

82

Deseo escribir un script de shell para exportar variables.

A continuación, he enumerado el guión.

echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH='/home/linux/Practise/linux-devkit/bin/:$PATH';
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-';
echo "Export CROSS_COMPILE done"

Pero esto no parece funcionar correctamente. En su lugar, tengo que ejecutar individualmente los comandos en el indicador de shell.

Prag Rao
fuente
¿Qué shell está usando (por ejemplo, bash, ksh, sh)
Tom
posible duplicado de Save Global variables BASH
tripleee
Posible duplicado de la exportación no funciona en mi script de shell
usuario

Respuestas:

48

Muéstrenos más partes del script y díganos qué comandos tuvo que ejecutar individualmente y desea simplemente.

Mientras tanto, debe usar comillas dobles, no comillas simples para expandir las variables:

export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"

Los puntos y comas al final de un solo comando tampoco son necesarios.

Hasta aquí:

#!/bin/sh
echo "Perform Operation in su mode"
export ARCH=arm
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Porque supuedes ejecutarlo con:

su -c 'sh /path/to/script.sh'

Nota: El OP no pedía explícitamente pasos sobre cómo crear variables de exportación en un shell interactivo utilizando un script de shell. Solo pidió que se evaluara su guión como máximo. No mencionó detalles sobre cómo se usaría su guión. Pudo haber sido usando .o sourcedesde el shell interactivo. Podría haber sido un scipt independiente o podría haber sido tomado sourcede otro guión. Las variables de entorno no son específicas de los shells interactivos. Esta respuesta resolvió su problema.

konsolebox
fuente
1
Hola konsolebox !! Muchas gracias . pero no entendí la diferencia .. export PATH = "/ home / linux / Practice / linux-devkit / bin /: $ PATH" entre comillas dobles. & export CROSS_COMPILE = '/ home / linux / Practice / linux-devkit / bin / arm-arago-linux-gnueabi-' entre comillas simples. el script modificado por u funciona bien.
Prag Rao
La expansión de @PragRao Paramater simplemente no ocurre entre comillas simples. Puede haber explicado más detalles sobre la cotización aquí .
konsolebox
3
El nombre de la pregunta de @konsolebox suena como "Script de shell para establecer variables de entorno"; la mayor parte de la comunidad encontró esta pregunta solo para resolver el problema de ejecutar este tipo de script desde el shell actual ( sourceo .). Aprecio que responda exactamente a la pregunta de OP, pero encontré este tema en Google, y la siguiente respuesta me ayudó más que la suya. Upvotes para la segunda respuesta (con sourcey .confirmo mi opinión ...
avtomaton
@avtomaton Una vez más, no se trata de otras personas que lo encuentran en Google. Se trata solo del enfoque original de la pregunta. Si le preocupa cómo se debe cambiar una pregunta o cómo se debe presentar una respuesta, considere discutirlo en meta.
konsolebox
226

Necesita ejecutar el script como sourceo la abreviatura.

source ./myscript.sh

o

. ./myscript.sh

Esto se ejecutará dentro del shell existente, asegurando que las variables creadas o modificadas por el script estarán disponibles después de que se complete el script.

La ejecución de la secuencia de comandos solo con el nombre de archivo ejecutará la secuencia de comandos en una subcapa separada.

mbaird
fuente
2
by using source ./setenv.sh -: da el error de fuente no encontrada. y usando. ./setenv.sh da no se puede abrir setenv.sh. Puedes por favor ayudarme en esto. Gracias
Vishal
1
¿Me estaba rascando la cabeza durante una hora por qué esas malditas vars de exportación no están allí (zsh) probadas typeset -gx, exportadas, etc. momento y, sin embargo, no sabía que una subcapa se ejecuta con su propio alcance. gracias por salvarme el día de la inminente gestión de la falta de ira
Inoperable
1

Ejecute el script como source = para ejecutarlo también en modo de depuración.

source= ./myscript.sh
Anurag Mondal
fuente
0

No puedo resolverlo con source ./myscript.sh. Dice el error de fuente no encontrada.
Falló también al usar . ./myscript.sh. Da no se puede abrir myscript.sh.

Entonces, mi opción es ponerlo en un archivo de texto para que se llame en el siguiente script.

#!/bin/sh
echo "Perform Operation in su mode"
echo "ARCH=arm" >> environment.txt
echo "Export ARCH=arm Executed"
export PATH="/home/linux/Practise/linux-devkit/bin/:$PATH"
echo "Export path done"
export "CROSS_COMPILE='/home/linux/Practise/linux-devkit/bin/arm-arago-linux-gnueabi-' ## What's next to -?" >> environment.txt
echo "Export CROSS_COMPILE done"
# continue your compilation commands here
...

Entonces llámelo cuando sea necesario:

while read -r line; do
    line=$(sed -e 's/[[:space:]]*$//' <<<${line})
    var=`echo $line | cut -d '=' -f1`; test=$(echo $var)
    if [ -z "$(test)" ];then eval export "$line";fi
done <environment.txt
Chetabahana
fuente
1
Puede modificar myscript.shpara que genere un archivo llamado environment.sh(con las declaraciones de exportación) y luego solo fuente en environment.shlugar del ciclo while siempre que sea necesario.
Slajma