To udokumentowana funkcja.
Jeśli uruchomisz bash za pomocą dowiązania symbolicznego sh
, bash rozpocznie się w sh
trybie 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
$0
to 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, utc
i et
oba uruchomić ten sam plik wykonywalny ale zapewniają różne wyniki. Po uruchomieniu jako utc
wyś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