bash4.3 # pwd
/bin
bash4.3 # ll sh
lrwxrwxrwx. 1 root root 4 May 17 22:22 sh -> bash
bash4.3 # ll bash
-rwxr-xr-x. 1 root root 1072056 May 17 22:22 bash
bash4.3 # bash
bash4.3 # sh
sh-4.3#
Mein Betriebssystem ist Fedora 24 (Standard-GNOME-Version).
Aus dem Beispiel können wir wissen: unter /bin
, bash
eine ausführbare Binärdatei ist; sh
ist ein weicher Link zu bash
.
Meines Wissens type bash and press enter
sollte also genau das gleiche Ergebnis erzielt werden wie type sh and press enter
.
Wenn ich type bash and press enter
, bekomme ich [root@localhost bin]#
wie erwartet.
Wenn ich es jedoch type sh and press enter
bekomme, bekomme ich es überraschend sh-4.3#
.
Was ist die Ursache?
Antworten:
Das ist eine dokumentierte Funktion.
Wenn Sie bash über einen Symlink mit dem Namen ausführen
sh
, wird bash imsh
Kompatibilitätsmodus gestartet .Von
man bash
:Woher weiß ein Programm, mit welchem Namen es gestartet wurde?
Wenn es sich um ein Wechselstromprogramm handelt, kann es es überprüfen
argv[0]
. Wenn es sich um ein Shell- oder Perl-Skript handelt, kann es überprüft werden$0
.Betrachten wir als Beispiel dieses einfache Shell-Skript:
$0
ist der Name, unter dem das Skript aufgerufen wurde.${0##*/}
ist der Name, unter dem das Skript aufgerufen wurde, wobei alle Verzeichnisnamen entfernt wurden.Lassen Sie uns diesen Symlink erstellen:
Also,
utc
undet
beide führen dieselbe ausführbare Datei aus, liefern aber unterschiedliche Ergebnisse. Bei Ausführung alsutc
gibt es die Weltzeit aus. Bei Ausführung alset
wird die US-Ostzeit ausgegeben. Beispielsweise:quelle
argv[0]
, obvs)