Das ist eine dokumentierte Funktion.
Wenn Sie bash über einen Symlink mit dem Namen ausführen sh
, wird bash im sh
Kompatibilitätsmodus gestartet .
Von man bash
:
Wenn bash mit dem Namen sh aufgerufen wird, wird versucht, das Startverhalten historischer Versionen von sh so genau wie möglich nachzuahmen und dabei auch dem POSIX-Standard zu entsprechen. Beim Aufruf als interaktive Anmeldeshell oder als nicht interaktive Shell mit der Option --login wird zunächst versucht, Befehle aus / etc / profile und ~ / .profile in dieser Reihenfolge zu lesen und auszuführen. Die Option --noprofile kann verwendet werden, um dieses Verhalten zu verhindern. Beim Aufrufen als interaktive Shell mit dem Namen sh sucht bash nach der Variablen ENV, erweitert ihren Wert, wenn sie definiert ist, und verwendet den erweiterten Wert als Namen einer Datei zum Lesen und Ausführen. Da eine als sh aufgerufene Shell nicht versucht, Befehle aus anderen Startdateien zu lesen und auszuführen, hat die Option --rcfile keine Auswirkung. Eine nicht interaktive Shell, die mit dem Namen sh aufgerufen wird, versucht nicht, andere Startdateien zu lesen. Wenn bash als sh aufgerufen wird, wechselt es in den Posix-Modus, nachdem die Startdateien gelesen wurden.
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:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$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:
ln -s utc et
Also, utc
und et
beide führen dieselbe ausführbare Datei aus, liefern aber unterschiedliche Ergebnisse. Bei Ausführung als utc
gibt es die Weltzeit aus. Bei Ausführung als et
wird die US-Ostzeit ausgegeben. Beispielsweise:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016