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 manpage:

Ако 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