2012-01-27 8 views
2

Я работаю в среде UNIX, где /bin был настроен так:Баша, кажется, игнорирует BASH_ENV при доступе через линк

-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/bash -c 'echo $BASH_ENV' 
BASHRC READ 
/home/users/atomicpirate/.bashrc 

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

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

ответ

6

Цитирование bash manpage:

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

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

+0

Это интересный бит о '$ ENV', я не знал, что' sh' имеет аналогичную переменную окружения '' BASH_ENV' bash''. Благодаря! – atomicpirate

+0

В этом случае 'sh' использует только' $ ENV' для интерактивных оболочек, тогда как bash использует '$ BASH_ENV' для интерактивных и неинтерактивных оболочек. Таким образом, в вышеприведенном случае использование '$ ENV' не изменило бы результат. Тем не менее, хорошо знать об этом. – atomicpirate

+0

Спасибо, что указали это. Я обновил ответ. Обратите внимание, что поведение 'sh' значительно изменилось со временем. Вот выдержка из man-страницы FreeBSD sh: «В отличие от старых версий sh, сценарий ENV генерируется только при вызове интерактивных оболочек, что закрывает хорошо известное, а иногда и легко доступное отверстие безопасности, связанное с плохо продуманными сценариями ENV». –

3

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

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

+1

Вы правы - это не имеет никакого отношения к символической ссылке, это связано только с именем когда он вызывается. Не знал об этом поведении - спасибо! – atomicpirate