Ejecute un script al iniciar sesión usando ~ / .bash_login


14

Necesito ejecutar una secuencia de comandos cuando inicio y cierre sesión en mi Ubuntu.

Traté de poner el script en mi ~/.bash_loginpero no funcionó.

¿Hay una mejor ubicación donde pueda ejecutar mi script?

Mi script está ubicado /home/gsd/script/login.shy es ejecutable.

editar:

mi script se ejecuta cuando escribo: /home/gsd/script/login.shy se establece con + x

ahora, solo tengo: touch /home/gsd/test.txten la ~/.bash_loginprueba.

el archivo test.txt nunca se crea

editar 2:

gsd@laptop:~$ ll ~/.bash*
-rw------- 1 gsd gsd 38639 2012-01-25 17:25 .bash_history
-rw-r--r-- 1 gsd gsd    29 2012-01-25 15:22 .bash_login
-rw-r--r-- 1 gsd gsd   220 2011-11-03 19:22 .bash_logout
-rw-r--r-- 1 gsd gsd  3136 2011-11-04 08:00 .bashrc

¿Tiene .bash_login los permisos correctos? ¿Qué devuelve ls -l .bash_login?
santiagozky

¿También tienes un ~/.bash_profile?
enzotib

-rw-r--r-- 1 gsd gsd 313 2012-01-22 11:56 .bash_login
Gino Sullivan

1
chmod +x .bash_login
Zoke

1
No es necesario chmod +x .bash_login(establecer el bit ejecutable en .bash_login). El manual de Bash es un poco confuso en esta área, pero Bash no ejecuta .bash_login como un script de shell. Sí lee el archivo y luego ejecuta los comandos dentro de él (puede hacer algo similar ejecutando source ~/.bash_login).
Stefan Lasiewski

Respuestas:


20

Si existe .bash_profile, Bash no leerá .bash_login (o .profile). Esta característica molesta se describe en algunas versiones del manual de Bash, pero no en todas.

.bash_profiley .bash_loginson análogos, por lo que te recomiendo que pongas tus comandos .bash_profile, porque se usa comúnmente y .bash_logines relativamente desconocido También considere poner sus comandos en .bashrclugar de .bash_profile. El manual describe la diferencia entre "shell de no inicio de sesión interactivo" y "shell de inicio de sesión interactivo", así que asegúrese de leer esa sección.

El GNU Bash Reference Manual versión 4.1: Bash Startup Files dice:

busca ~ / .bash_profile, ~ / .bash_login y ~ / .profile, en ese orden, y lee y ejecuta comandos desde el primero que existe y es legible.

También vea esta pregunta sobre el superusuario y este tutorial de Bash (No se desanime por la dirección freeunix.dyndns.org:8088 --- todavía es un manual de buena calidad y lo he usado durante años).

Actualización , ya que dice que no tiene un .bash_profile.

Parece que no está utilizando lo que se llama un "shell interactivo sin inicio de sesión" (consulte el manual de Bash para obtener una descripción detallada).

Para probar esto, añadir algo como lo siguiente cada archivo: .bashrc, .bash_profiley .bash_login.

echo "DEBUG: I am .bashrc"

echo "DEBUG: I am .bash_profile"

Luego cierre sesión e inicie sesión nuevamente. Cuando inicie sesión, apuesto a que solo verá la frase "DEPURACIÓN: soy .bashrc" pero no "soy .bash_profile". Si es así, significa que usted es un "shell interactivo sin inicio de sesión", lo que simplemente significa que Bash llamará .bashrcpero no .bash_profile. Para obtener información sobre por qué estos archivos de puntos son como son, consulte la publicación de @Andrejs Cainikovs a continuación y http://mywiki.wooledge.org/DotFiles


actualicé mi pregunta, no tengo un bash_profile
Gino Sullivan

Ok, porque antes dijiste "sí, tengo un perfil bash".
Stefan Lasiewski

Sí, lo quité y luego lo eliminé, pero los mismos resultados
Gino Sullivan

3
Esta respuesta resuelve el problema, creo que vale la pena aceptarlo.
Marius Butuc

1
También tenga en cuenta que estos archivos bash solo se ejecutan al iniciar sesión en un shell (a través de Terminal, ssh, etc.), no al iniciar sesión en la GUI.
mivk

5

Los shells de inicio de sesión, independientemente de si son interactivos o no, leen y ejecutan.profile

Los shells interactivos leen y ejecutan .bashrc.

A menudo verá las /etc/profilefuentes .bashrc, por lo que todas las configuraciones realizadas .bashrctambién tendrán efecto en un shell de inicio de sesión independientemente de si es interactivo o no interactivo.

El orden de ejecución de los scripts de inicialización para un shell depende de si el shell es interactivo o no interactivo y no está relacionado con si es un script de inicio de sesión o no.

Cuando se invoca bash como un shell de inicio de sesión interactivo , lee y ejecuta comandos desde /etc/profile. Luego, Bash intentará ejecutar SOLO el primer archivo que exista y sea legible de lo siguiente:

  1. .bash_profile
  2. .bash_login
  3. .profile

Si se encuentra uno de estos archivos pero no se puede leer, causará un error. No hay ningún error si NO se encuentra alguno .

Este mismo proceso se sigue cuando se invoca un shell de inicio de sesión no interactivo con la --loginopción.


1
AFAIK, el .profilearchivo se lee y ejecuta solo cuando el usuario inicia sesión con la interfaz gráfica. De lo contrario, no se lee.
RajaRaviVarma

@RajaRaviVarma que acabo de probar (Ubuntu 16.04) y ~/.profiledefinitivamente se lee en shells de inicio de sesión no gráficos (probé al cambiar a otro terminal Ctrl+Alt+F2e iniciar sesión allí).
waldyrious

Estoy de acuerdo con @RajaRaviVarma: estoy iniciando sesión en una máquina virtual Ubuntu 16.04 a través de SSH y .profileno solo se lee.bashrc
jamesc

0

Asegúrese de que el script que desea ejecutar sea ejecutable. Corre chmod +x scriptnamepara hacer eso. También asegúrese de que el script comience con el shebang correcto ( #!/bin/bashpara los scripts de shell). Por último, use todas las rutas completas al ejecutarlo, por ejemplo, en /usr/bin/echolugar de echosolo en caso de que el entorno en el que se ejecutará su script no sea idéntico al que está acostumbrado.


0

Bash solo busca .bash_logino .profilearchivos si se ejecuta como shell de inicio de sesión interactivo. Cuando se ejecuta como un shell interactivo sin inicio de sesión, se lee .bashrc.
Comúnmente es el segundo caso, es decir, cuando ejecuta gnome-terminalbash se ejecuta como shell sin inicio de sesión.

Esto indica claramente que si está iniciando en Gnome, .bash_loginno se ejecutará. Pero si baja el nivel de ejecución para iniciar directamente en bash, el mismo archivo se ejecutará al iniciar sesión correctamente.
Supongo que .bash_logintambién se ejecutará en caso de conexiones SSH remotas.

Parcialmente arrancado de aquí .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.