Warum gibt es ein Minuszeichen in "$0 " auf dem Mac?

Ich habe ein GNU/Linux-Benutzer seit Jahren, aber ich kann nicht herausfinden, wie man brauchbares Verfahren info auf Mac.

Ich habe festgestellt, dass $0 in meiner Login-Shell unter Mac OS (Snow Leopard) zu -bash aufgelöst wird. Dadurch können bestimmte Shell-Skripte unterbrochen werden, die in einer Linux-Umgebung einwandfrei funktionieren*.

Leider erwähnt die Manpage diese Tatsache nicht

Wenn bash mit a aufgerufen wird datei von Befehlen, $0 wird auf den Namen dieser Datei gesetzt. Wenn bash wird mit der Option-c gestartet, dann wird $0 auf die erstes Argument nach der auszuführenden Zeichenfolge, falls vorhanden. Andernfalls wird es auf den verwendeten Dateinamen gesetzt bash aufrufen, wie durch Argument Null angegeben.

Hat das Minuszeichen eine besondere Bedeutung? Gibt es etwas wie /proc oder ein Befehlszeilentool, mit dem ich die zugehörige ausführbare Datei finden kann?

* Dummes ich. Natürlich wird $0 auf den Skriptnamen ausgewertet, wie in angegeben das Handbuch

Author: user123444555621, 2010-09-12

3 answers

Das Minuszeichen ist die Art und Weise, wie das System der Shell mitteilt, dass sie als Anmeldeshell aufgerufen wird und ~/.profile (für Bourne-kompatible Shells). Dies gilt für Linux, OSX und jedes andere Unix. Ein Skript wird nicht in einer Login-Shell ausgeführt. Für ein Skript ist $0 der Name der Skriptdatei (mit oder ohne vollständigen Pfad).

HINZUGEFÜGT: Der man-page erklärt (fast alle) die verschiedenen Fälle:

  • "Wenn bash mit einer Befehlsdatei aufgerufen wird, $0 wird auf den Namen dieser Datei gesetzt."Dies umfasst Skripte, die mit bash myscript ausgeführt werden, sowie den indirekten Fall, in dem das Skript direkt ausgeführt wird und mit #!/bin/bash beginnt.

  • "Wenn bash mit der Option-c gestartet wird, wird $0 auf das erste Argument nach der auszuführenden Zeichenfolge gesetzt, falls eines vorhanden ist."Mit -c, $0 ist auf das gesetzt, was der Aufrufer explizit angibt.

  • "Andernfalls wird es auf den Dateinamen gesetzt, der zum Aufrufen von bash verwendet wird, wie durch Argument angegeben null."Eine Anmeldeshell fällt in diesen Fall: Die Shell wird ohne andere Argumente als Argument Null aufgerufen, sodass $0 auf Argument Null gesetzt ist. Es ist login, su, oder welches Programm auch immer das Login behandelt hat, das die Argumente auswählt, die es an die Shell übergeben hat, und dem Argument zero ein - voranstellt, um der Shell mitzuteilen, dass es sich um eine Login-Shell handelt.

Vielleicht ist eine Erklärung des Arguments Null in Ordnung. Wenn ein Programm ausgeführt wird, findet letztendlich ein execve Systemaufruf statt. Dass systemaufruf nimmt drei Argumente:

  1. Ein Dateiname, der eine vorhandene ausführbare Datei bezeichnen muss. Der Kernel lädt diese Datei und überträgt die Ausführung an sie.

  2. Ein Array von Strings, die Argumente genannt. Element Null in diesem Array ist durch die Konvention der gleiche Dateiname wie oben oder nur der Dateiname ohne den vollständigen Pfad, wenn der Speicherort der ausführbaren Datei durch Durchsuchen der Umgebungsvariablen $PATH bestimmt wurde. Es gibt Ausnahmen zu dieser Konvention, wie Login-Shells.

  3. Ein weiteres Array von Strings, genannt die Umgebung.

Wenn Sie ein Programm aus der Shell aufrufen, indem Sie myprogram foo bar eingeben, lauten die Argumente für execve:
    1. /usr/bin/myprogram (vorausgesetzt, hier hat die Shell myprogram gefunden)
    2. myprogram, foo, bar
    3. für jede exportierte Shell-Variable der Variablenname gefolgt von einem Gleichheitszeichen und dem Wert.

Es gibt keinen allgemeinen Weg, den Namen des ausführbare Datei, die vom laufenden Programm an execve übergeben wurde. Unter Linux ist es normalerweise als /proc/$$/exe wobei $$ die Prozess-ID ist. Jedes Unix stellt es ps zur Verfügung, aber das Innenleben von ps ist sehr unterschiedlich. Die ausführbare Datei kann gelöscht oder umbenannt werden, während das Programm ausgeführt wird; in diesem Fall kann ps veraltete Informationen oder keine Informationen melden.

 6
Author: Gilles 'SO- stop being evil',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-09-12 15:44:18

Von man bash:

Exec [- cl] [- ein Name] [Befehl [Argumente]]
Wenn Befehl angegeben ist, ersetzt es die Shell. Kein neuer Prozess erstellt wird. Die Argumente werden zu den Argumenten für den Befehl. Wenn wenn die Option-l angegeben wird, platziert die Shell einen Bindestrich am Anfang des an den Befehl übergebenen Arguments Null. Dies ist, was login(1) ist. ...

 1
Author: Dennis Williamson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-09-12 14:01:26

Ich bin mir nicht sicher, was mit-bash los ist, aber wenn Sie bash erneut in der Shell ausführen, scheint der Wert von $0 in Ordnung zu sein.

Es scheint etwas Besonderes zu sein, was os x tut, denn wenn Sie /usr / bin / login ausführen, das das Standardskript ist, das vom Terminalprogramm verwendet wird, wird dasselbe Problem mit $0 angezeigt.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-09-13 03:42:55