bash, кажется, игнорирует BASH_ENV при доступе через символическую ссылку

Я работаю в среде UNIX, где /bin настроен следующим образом:

-rwxr-xr-x  1 root root 617144 Nov 19  2009 bash
lrwxrwxrwx  1 root root      4 Nov 23  2010 sh -> bash

В моей среде я установил $BASH_ENV, чтобы указать на мой локальный .bashrc:

env | grep BASH
BASH_ENV=/home/users/atomicpirate/.bashrc

Кроме того, .bashrc имеет первую строку echo BASHRC READ.

Я бы ожидал, что /bin/sh и /bin/bash будут вести себя точно так же с этой настройкой... но это не так:

/bin/bash -c 'echo $BASH_ENV'
BASHRC READ
/home/users/atomicpirate/.bashrc

/bin/sh -c 'echo $BASH_ENV'
/home/users/atomicpirate/.bashrc

Во втором случае .bashrc НЕ читается. Есть идеи, почему это так? Похоже, символическая ссылка нарушает ожидаемое поведение $BASH_ENV.


person atomicpirate    schedule 27.01.2012    source источник


Ответы (2)


Цитирование справочной страницы bash:

Если bash вызывается с именем sh, он пытается максимально точно имитировать поведение при запуске предыдущих версий sh, при этом также соответствуя стандарту POSIX.

Обратите внимание, что при запуске в качестве интерактивной оболочки современная sh использует $ENV аналогично тому, как bash использует $BASH_ENV. Это поведение также имитируется bash.

person Adam Zalcman    schedule 27.01.2012
comment
Это интересный момент о $ENV, я не знал, что sh имеет переменную окружения, аналогичную $BASH_ENV bash. Спасибо! - person atomicpirate; 27.01.2012
comment
Если посмотреть глубже, sh использует только $ENV для интерактивных оболочек, тогда как bash использует $BASH_ENV как для интерактивных, так и для неинтерактивных оболочек. Таким образом, в приведенном выше случае простое использование $ENV не изменило бы результат. Все же хорошо быть в курсе. - person atomicpirate; 27.01.2012
comment
Спасибо за указание на это. Я обновил ответ. Обратите внимание, что поведение sh со временем значительно изменилось. Вот выдержка из справочной страницы FreeBSD sh: В отличие от старых версий sh, сценарий ENV запускается только при вызове интерактивных оболочек. Это закрывает известную, а иногда легко эксплуатируемую дыру в безопасности, связанную с плохо продуманными сценариями ENV. - person Adam Zalcman; 27.01.2012
comment
Ссылка на справочную страницу UNIX sh: enseignement.polytechnique.fr/informatique/INF422/sh. html - person Adam Zalcman; 27.01.2012

Когда bash вызывается как sh, он намеренно ведет себя иначе и отключает ряд расширений bash.

Похоже, что одно из изменений заключается в том, что он больше не читает файл, продиктованный $BASH_ENV. Вы можете доказать, что это не имеет ничего общего с символической ссылкой, превратив файл в обычный файл (временно) и увидев такое же поведение с обычным файлом.

person Jonathan Leffler    schedule 27.01.2012
comment
Вы правы - это не имеет ничего общего с символической ссылкой, это связано только с именем оболочки при ее вызове. Не знал о таком поведении - спасибо! - person atomicpirate; 27.01.2012