¿Recargar .profile en el script de shell bash (en unix)?

130

Soy nuevo en bash shell scripting y me he encontrado con un desafío. Sé que puedo volver a cargar mi archivo ".profile" simplemente haciendo:

. .profile

pero estoy tratando de ejecutar lo mismo en un script bash que estoy escribiendo y simplemente no funciona. ¿Algunas ideas? ¿Algo más que pueda proporcionar para aclarar?

Gracias

Amir Rustamzadeh
fuente
Como Ignacio señala a continuación, su secuencia de comandos se ejecuta en una subshell. El subshell no puede modificar el shell principal (el proceso hijo no puede modificar su padre). Por lo tanto, debe "obtener" el script utilizando el "." comando (que también se puede deletrear como "fuente"). Entonces, si su secuencia de comandos quiere, por ejemplo, modificar las variables de entorno, debe hacer algo como "fuente de MyScript" o ". Myscript" (ambas significan lo mismo). Esto modificará el entorno de su shell principal. (Lo que creo que es lo que estás tratando de hacer, avísame si esto está mal.)
bstpierre
1
Recibí mi respuesta de tu pregunta :)
Kolob Canyon

Respuestas:

195

Pruebe esto para recargar su shell actual:

source ~/.profile
kofriel
fuente
1
¿Tienes una solución alternativa? Porque usar el sourcecomando ejecutará el archivo como un script ... En el peor de los casos, si alguien usara una asignación de variable como MyVar="$foo$MyVar"en su bash_profile, entonces source ~/.profiledaría el resultado final MyVar="$foo$MyVar$MyVar", por $MyVarlo tanto, tendría un valor incorrecto después. (Independientemente de las malas prácticas, solo solicite una solución alternativa)
Jeffrey Mvutu Mabilama
9

Prueba esto:

cd 
source .bash_profile
girardengo
fuente
5

Surgen un par de problemas al intentar recargar / source ~ / .profile file. [Esto se refiere a Ubuntu Linux - en algunos casos los detalles de los comandos serán diferentes]

  1. ¿Está ejecutando esto directamente en la terminal o en un script?
  2. ¿Cómo ejecutas esto en un script?

Anuncio. 1)

Ejecutar esto directamente en la terminal significa que no se creará ningún subshell. Entonces puedes usar cualquiera de los dos comandos:

source ~/.bash_profile

o

. ~/.bash_profile

En ambos casos, esto actualizará el entorno con el contenido del archivo .profile.

Anuncio 2) Puede iniciar cualquier script bash llamando

sh myscript.sh 

o

. myscript.sh

En el primer caso, esto creará una subshell que no afectará las variables de entorno de su sistema y serán visibles solo para el proceso de la subshell. Después de finalizar el comando subshell, no se aplicará ninguna de las exportaciones, etc. ESTE ES UN ERROR COMÚN Y CAUSA A MUCHOS DESARROLLADORES QUE PIERDEN MUCHO TIEMPO.

Para que los cambios aplicados en su script tengan efecto en el entorno global, el script debe ejecutarse con

.myscript.sh

mando.

Para asegurarse de que su script no se ejecute en un subshel, puede usar esta función. (De nuevo, el ejemplo es para el shell de Ubuntu)

#/bin/bash

preventSubshell(){
  if [[ $_ != $0 ]]
  then
    echo "Script is being sourced"
  else
    echo "Script is a subshell - please run the script by invoking . script.sh command";
    exit 1;
  fi
}

¡Espero que esto aclare algunos de los malentendidos comunes! : D ¡Buena suerte!

twboc
fuente
4

El script bash se ejecuta en una subshell separada. Para que esto funcione, también necesitará obtener este otro script.

Ignacio Vazquez-Abrams
fuente
No estoy seguro (aún nuevo en todo esto) a qué te refieres exactamente con "fuente": el otro script. Podría por favor ampliar un poco sobre eso. Sin embargo, he intentado: $. ~ / .profile $. / etc / profile sin éxito. Muchas gracias.
Amir Rustamzadeh
1
@amirrustan: Su secuencia de comandos necesitará obtener su .profilearchivo de una forma similar a esta: . $HOME/.profiley deberá iniciar su secuencia de comandos también. Algo así como. /path/to/yourscript
Pausado hasta nuevo aviso.
1
@amirrustam lea superuser.com/questions/176783/...
Lesmana
1

Tratar:

#!/bin/bash
# .... some previous code ...
# help set exec | less
set -- 1 2 3 4 5  # fake command line arguments
exec bash --login -c '
echo $0
echo $@
echo my script continues here
' arg0 "$@"
tilo
fuente