Це задокументована особливість.
Якщо ви запускаєте bash через символьне посилання на ім'я sh
, bash запуститься в sh
режимі сумісності.
Від man bash
:
Якщо bash викликається назвою sh, він намагається максимально наблизити поведінку до запуску історичних версій sh, дотримуючись стандарт POSIX. Коли викликається як інтерактивна оболонка входу, або неінтерактивна оболонка з опцією --login, вона спочатку намагається прочитати та виконати команди з / etc / profile та ~ / .profile у такому порядку. Параметр --noprofile може використовуватися для гальмування такої поведінки. Коли викликається інтерактивна оболонка з ім'ям sh, bash шукає змінну ENV, розширює її значення, якщо вона визначена, і використовує розширене значення як ім'я файлу для читання та виконання. Оскільки оболонка, на яку посилається sh, не намагається читати та виконувати команди з будь-яких інших файлів запуску, параметр --rcfile не впливає. Неінтерактивна оболонка з ім'ям sh не намагається прочитати інші файли запуску. При виклику як sh, bash переходить у режим posix після зчитування файлів запуску.
Як програма знає, яке ім’я було використано для її запуску?
Якщо це програма змінного струму, вона може перевірити argv[0]
. Якщо це сценарій оболонки або perl, він може перевірити $0
.
Як приклад розглянемо цей простий скрипт оболонки:
$ cat utc
#!/bin/sh
case "${0##*/}" in
utc) date -u ;;
et) TZ=US/Eastern date ;;
esac
$0
- це ім'я, до якого був названий сценарій. ${0##*/}
- це ім'я, яке викликали скрипт із видаленими будь-якими іменами каталогу.
Створимо це символьне посилання:
ln -s utc et
Отже, utc
і et
обидва виконують один і той же виконуваний файл, але вони дають різні результати. При запуску як utc
, він виводить універсальний час. Коли запускається як et
, виводиться східний час США. Наприклад:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016