2010-07-18 25 views
98

Soy nuevo en scripts de shell bash, y he encontrado un desafío. Sé que puedo recargar mi archivo ".profile" con sólo hacer:¿Volver a cargar .profile en script bash shell (en Unix)?

. .profile 

pero estoy tratando de ejecutar el mismo en una escritura del golpe que estoy escribiendo y simplemente no está funcionando. Alguna idea? ¿Algo más que pueda proporcionar para aclarar?

Gracias

+0

Como Ignacio señala a continuación, su secuencia de comandos se ejecuta en una subshell. La subshell no puede modificar el shell principal (el proceso hijo no puede modificar su principal). Por lo tanto, debe "generar" el script utilizando el "." comando (que también se puede escribir como "fuente"). Entonces, si su script quiere, digamos, modificar variables de entorno, necesita hacer algo como "source myscript" o ". Myscript" (ambos significan lo mismo). Esto modificará el entorno de tu caparazón principal. (Lo cual creo que es lo que estás tratando de hacer, házmelo saber si esto está mal.) – bstpierre

+1

Recibí mi respuesta de tu pregunta :) –

Respuesta

149

Prueba esto para recargar su shell actual:

source ~/.profile 
3

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

+0

No estoy seguro (aún siendo nuevo en todo esto) de lo que exactamente te refieres por "fuente" -ing la otra secuencia de comandos. Podría por favor ampliar un poco sobre eso. Sin embargo, he intentado: $. ~/.profile $./etc/profile sin éxito. Muchas gracias. –

+1

@amirrustan: Tu script necesitará obtener de tu archivo '.profile' algo como esto:'. $ HOME/.profile' y tendrá que iniciar su script comprándolo también. Algo como './path/to/yourscript' –

+1

@amirrustam, por favor, lea http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash- script/176788 # 176788 – lesmana

0

Probar:

#!/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 [email protected] 
echo my script continues here 
' arg0 "[email protected]" 
1

Un par de problemas surgen cuando se trata de recargar/fuente ~ archivo /.profile [Esto se refiere a Ubuntu Linux - en algunos casos, los detalles de los comandos serán diferentes]

  1. ¿Está ejecutando esto directamente en el terminal o en un script?
  2. ¿Cómo se ejecuta esto en un script?

Ad. 1)

Al ejecutar esto directamente en el terminal significa que no se creará ninguna subcapa. Así que usted puede utilizar cualquiera de dos comandos:

source ~/.bash_profile 

o

. ~/.bash_profile 

En ambos casos esto actualizará el medio ambiente con el contenido del archivo .profile.

Ad 2) Puede iniciar cualquier escritura del golpe, ya sea llamando

sh myscript.sh 

o

. myscript.sh 

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

Para que los cambios aplicados en la secuencia de comandos en sus efectos para el medio ambiente mundial el guión tiene que ser ejecutado con el comando

.myscript.sh 

.

Para asegurarse de que su script no se ejecuta en un subshello puede usar esta función. (De nuevo ejemplo es para la cáscara 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!

Cuestiones relacionadas