¿Por qué 'echo $ 0' da resultados diferentes para dos terminales diferentes?

15

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?

Código Azul
fuente
$ 0 devuelve el nombre del proceso en ejecución.
Ramesh
¿Corres dos terminales con un usuario diferente?
Cuonglm
Yo uso el mismo usuario
CodeBlue
¿Son realmente diferentes emuladores de terminal o solo dos instancias del mismo emulador de terminal? ¿Son ambos el terminal predeterminado?
terdon

Respuestas:

16

Si la salida del echo $0comando es -bash, significa que bashse invocó como un shell de inicio de sesión. Si la salida es solo bash, entonces está en un shell sin inicio de sesión.

man bash dice en algún lugar en la línea 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

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):

ingrese la descripción de la imagen aquí

Radu Rădeanu
fuente
12

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.

X Tian
fuente
9

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 :sha vi, o cuando se crea una nueva ventana de terminal.

Originalmente, el shell se leía ~/.profilecuando iniciaba sesión o corría su. 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 de argv[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 usuario argv[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.

Mark Plotnick
fuente