¿Por qué aparece un signo menos en "$0" en Mac?

¿Por qué aparece un signo menos en "$0" en Mac?

He sido usuario de GNU/Linux durante años, pero no sé cómo obtener información de proceso utilizable en Mac.

Me di cuenta de que eso $0se resuelve -bashen mi shell de inicio de sesión en Mac OS (Snow Leopard).Esto puede romper ciertos scripts de shell que funcionan bien en un entorno Linux.*.

Desafortunadamente, la página de manual no menciona este hecho.

Si se invoca bash con un archivo de comandos, $0 se establece con el nombre de ese archivo. Si bash se inicia con la opción -c, entonces $0 se establece en el primer argumento después de la cadena que se ejecutará, si hay alguna presente. De lo contrario, se establece en el nombre del archivo utilizado para invocar bash, según lo indicado por el argumento cero.

¿Tiene el signo menos un significado especial? ¿Existe algo parecido /proco una herramienta de línea de comandos que pueda ayudarme a encontrar el ejecutable asociado?

* Tonto de mí. Por supuesto, $0 se evaluará según el nombre del script, como se indica en el manual.

Respuesta1

El signo menos es la forma en que el sistema le dice al shell que se invoca como un shell de inicio de sesión y que debe generar ~/.profile(para shells compatibles con Bourne). Esto es cierto en Linux, OSX y cualquier otro Unix. Un script no se ejecutaría en un shell de inicio de sesión. Para un script, $0es el nombre del archivo del script (con o sin la ruta completa).

AGREGADO: La página de manual explica (casi todos) los diferentes casos:

  • "Si se invoca bash con un archivo de comandos, $0 se establece con el nombre de ese archivo". Esto cubre los scripts ejecutados con bash myscript, así como el caso indirecto en el que el script se ejecuta directamente y comienza con #!/bin/bash.

  • "Si bash se inicia con la opción -c, entonces $0 se establece en el primer argumento después de la cadena que se ejecutará, si hay alguna presente". Con -c, $0se establece en lo que indique explícitamente la persona que llama.

  • "De lo contrario, se establece en el nombre del archivo utilizado para invocar bash, según lo indicado por el argumento cero". Un shell de inicio de sesión cae en este caso: el shell se invoca sin más argumentos que el argumento cero, por lo que $0se establece en el argumento cero. Es login, su, o cualquier programa que haya manejado el inicio de sesión el que elige los argumentos que pasó al shell y antepone un -argumento cero para indicarle al shell que es un shell de inicio de sesión.

Quizás sea necesaria alguna explicación del argumento cero. Cuando se ejecuta un programa, en última instancia, execvese realiza una llamada al sistema. Esa llamada al sistema toma tres argumentos:

  1. un nombre de archivo, que debe designar un archivo ejecutable existente. El kernel carga este archivo y le transfiere la ejecución.

  2. una serie de cadenas, llamadas argumentos. El elemento cero en esta matriz espor convenciónel mismo nombre de archivo que el anterior, o solo el nombre del archivo sin la ruta completa si la ubicación del ejecutable se determinó buscando en la $PATHvariable de entorno. Hay excepciones a esta convención, como los shells de inicio de sesión.

  3. otro conjunto de cadenas, llamado entorno.

Cuando llama a un programa desde el shell escribiendo myprogram foo bar, los argumentos execveson:
    1. /usr/bin/myprogram(suponiendo que aquí es donde encontró el shell myprogram)
    2. ,, myprogram3.     para cada variable de shell exportada, el nombre de la variable seguido de un signo igual y el valor .foobar

No existe una forma general de encontrar el nombre del archivo ejecutable al que se pasó execvedesde el programa en ejecución. En Linux, normalmente está disponible /proc/$$/exedónde $$está el ID del proceso. Cada Unix lo pone a disposición, pspero el funcionamiento interno psdifiere ampliamente. El ejecutable se puede eliminar o cambiar de nombre mientras el programa se está ejecutando; en este caso pspodría reportar información obsoleta o sin información.

Respuesta2

De man bash:

exec [-cl] [-a nombre] [comando [argumentos]]
Si se especifica el comando, reemplaza el shell. No se crea ningún proceso nuevo. Los argumentos se convierten en argumentos para mandar. Si se proporciona la opción -l, el shell coloca un guión al principio del argumento cero pasado al comando. Esto es lo que hace login(1). ...

Respuesta3

No estoy seguro de qué está pasando con -bash , pero si ejecuta bash nuevamente en el shell, el valor de $0 parece estar bien.

Parece ser algo especial que está haciendo OS x, porque si ejecuta /usr/bin/login, que es el script predeterminado utilizado por el programa terminal, aparece el mismo problema con $0.

información relacionada