Это документированная особенность.
Если вы запустите 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
, он выводит универсальное время. При запуске as et
выводит восточное время США. Например:
$ utc
Wed Jul 20 18:14:18 UTC 2016
$ et
Wed Jul 20 14:14:20 EDT 2016