Abrí un terminal en Ubuntu usando Ctrl+ Alt+ Ty un terminal diferente yendo a un directorio y luego haciendo clic derecho y seleccionando "Abrir en Terminal".
Hice un echo $0
en ambos casos.
En el primer caso:
$ echo $0
-bash
En el segundo caso:
$ echo $0
/bin/bash
¿Por qué esta diferencia?
bash
ubuntu
terminal
gnome-terminal
Código Azul
fuente
fuente
Respuestas:
Si la salida del
echo $0
comando es-bash
, significa quebash
se invocó como un shell de inicio de sesión. Si la salida es solobash
, entonces está en un shell sin inicio de sesión.man bash
dice en algún lugar en la línea 126:Ver más sobre aquí: ¿ Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión? .
Ahora, para explicar por qué entras
/bin/bash
en el segundo caso, puedo decir que un programa (en tu caso, tu administrador de archivos, probablemente nautilus) o un script puede cambiar el suyo$0
a otra cosa. Como ejemplo, vea lo que sucede$0
en mi terminal (la misma terminal todo el tiempo):fuente
La diferencia se debe a la forma en que se iniciaron. bash se inicializará de manera diferente (leerá diferentes scripts de inicio) según sea argv [0]. Si la cadena comienza con un guión
-
como en-bash
entonces se ejecuta como un shell de inicio de sesión, si no, se ejecutará como un shell interactivo. También puede ejecutarse como un shell no interactivo (es decir, en un script de shell).Para obtener más información, es mejor leer el manual,
man bash
la sección INVOCACIÓN.fuente
Una cáscara se pone en marcha cuando se conecta, pero también se inició por programas como
make
, o cuando se ejecuta un script de shell, o cuando se escribe:sh
avi
, o cuando se crea una nueva ventana de terminal.Originalmente, el shell se leía
~/.profile
cuando iniciaba sesión o corríasu
. Este script haría cosas como anunciar si tenía un nuevo correo electrónico, personalizar sus caracteres de borrar y matar, y establecer y exportar las variables TERM y PATH. Cuando se inició en casi cualquier otro contexto, el shell no leía~/.profile
, porque hacer la mayoría de esas cosas sería redundante. Se esperaba que haya exportado cualquier variable de shell importante al nuevo shell.La forma en que el shell sabía si leer
~/.profile
era verificar si el primer carácter deargv[0]
, alias$0
, era'-'
.Comenzando con
csh
, se introdujeron alias. Los alias no se exportaron al medio ambiente.csh
fue diseñado para leer en dos secuencias de comandos de inicialización diferentes.~/.login
se leía solo cuando un usuarioargv[0]
iniciaba sesión y la señal para hacerlo era si comenzaba con'-'
.~/.cshrc
se leía cada vez que se iniciaba el shell. En general, uno coloca alias~/.cshrc
y todo lo demás en~/.login
.csh
también compatible~/.logout
, que en la mayoría de los casos simplemente borró la pantalla y se ejecutófortune
.Otros proyectiles adoptaron estas mismas características.
ksh
leería~/.kshrc
,bash
leería~/.bashrc
, y ahí es donde colocarías tus definiciones de alias.Entonces, para resumir, la aplicación que genera un shell puede decidir si debe ser un "shell de inicio de sesión", en cuyo caso existe
'-'
al principio, o un shell normal. En la mayoría de los casos, un shell que será interactivo se inicia como un shell de inicio de sesión, y un shell está destinado a ejecutar algunos comandos, ya sea como argumentos o desde un script, y luego salir es un shell normal.Pero todo depende del capricho de la aplicación que inicia el shell.
fuente