To udokumentowana funkcja.
Jeśli uruchomisz bash za pomocą dowiązania symbolicznego sh, bash rozpocznie się w shtrybie zgodności.
Od man bash:
Jeśli bash jest wywoływany z nazwą sh, próbuje naśladować zachowanie startowe historycznych wersji sh tak dokładnie, jak to możliwe, przy jednoczesnym zachowaniu zgodności ze standardem POSIX. Wywoływany jako interaktywna powłoka logowania lub nieinteraktywna powłoka z opcją --login, najpierw próbuje odczytać i wykonać polecenia z / etc / profile i ~ / .profile, w tej kolejności. Opcji --noprofile można użyć do zahamowania tego zachowania. Wywoływany jako interaktywna powłoka o nazwie sh, bash szuka zmiennej ENV, rozszerza jej wartość, jeśli jest zdefiniowana, i używa rozszerzonej wartości jako nazwy pliku do odczytu i wykonania. Ponieważ powłoka wywoływana jako sh nie próbuje czytać i wykonywać poleceń z innych plików startowych, opcja --rcfile nie ma wpływu. Nieinteraktywna powłoka wywołana nazwą sh nie próbuje odczytać żadnych innych plików startowych. Wywołany jako sh, bash przechodzi w tryb posiksowy po odczytaniu plików startowych.
Skąd program wie, jakiej nazwy użyto do jego uruchomienia?
Jeśli jest to program ac, może to sprawdzić argv[0]. Jeśli jest to skrypt powłoki lub perla, może to sprawdzić $0.
Jako przykład rozważmy ten prosty skrypt powłoki:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0to nazwa, z której skrypt został wywołany. ${0##*/}to nazwa wywołania skryptu z usuniętymi nazwami katalogów.
Stwórzmy to dowiązanie symboliczne:
ln -s utc et
Tak, utci etoba uruchomić ten sam plik wykonywalny ale zapewniają różne wyniki. Po uruchomieniu jako utcwyświetla czas uniwersalny. Po uruchomieniu jako et, wyprowadza czas wschodni USA. Na przykład:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016