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 $0en 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 $0comando es-bash, significa quebashse 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 bashdice 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/bashen el segundo caso, puedo decir que un programa (en tu caso, tu administrador de archivos, probablemente nautilus) o un script puede cambiar el suyo$0a otra cosa. Como ejemplo, vea lo que sucede$0en 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-bashentonces 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 bashla 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:shavi, o cuando se crea una nueva ventana de terminal.Originalmente, el shell se leía
~/.profilecuando 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
~/.profileera 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.cshfue diseñado para leer en dos secuencias de comandos de inicialización diferentes.~/.loginse leía solo cuando un usuarioargv[0]iniciaba sesión y la señal para hacerlo era si comenzaba con'-'.~/.cshrcse leía cada vez que se iniciaba el shell. En general, uno coloca alias~/.cshrcy todo lo demás en~/.login.cshtambié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.
kshleería~/.kshrc,bashleerí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