2015-07-20 2 views
3

В bash manual page состоянияпроход GLOBIGNORE к Баш вызова

If the shell is started with the effective user (group) id not equal to 
the real user (group) id, [...] the SHELLOPTS, BASHOPTS, CDPATH, and 
GLOBIGNORE variables if they appear in the environment, are ignored 

Так обычно это происходит.

> export GLOBIGNORE='*t*' 
> echo * 
afile 
> bash -i 
>> # look, the variable is passed through 
>> $ echo $GLOBIGNORE 
*t* 
>> # but to no effect 
>> $ echo * 
afile anotherfile athirdfile 

Я не думаю, что было бы смысла фальсифицировать реальный идентификатор пользователя, чтобы позволить прохождение GLOBIGNORE и ряд других нежелательных побочных эффектов.

Возможно ли сделать подоболочку уважаемой экспортируемой GLOBIGNORE?

ответ

0

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

Поскольку запуск оболочки на интерактивных оболочках различен, необходимы две стратегии.

Интерактивная

При запуске интерактивного сеанса, Баш обычно источники по умолчанию файл ~/.bashrc. Существует переключатель, чтобы изменить, где искать этот файл. Это может быть использовано без потерь, пока скрипт, переданный туда, перенаправляет исходное местоположение.

> echo 'GLOBIGNORE=*t*' > rc 
> echo 'source ~/.bashrc' >> rc 
> bash --rcfile rc -i 
>> echo * 

Non-Interactive, Modifyable Командная строка

As Cyrus already pointed out, можно просто увеличить команду с заданием так, что происходит внутри подоболочки, чтобы начать с.

> bash -c 'GLOBIGNORE="*t*" ; echo *' 

Полностью автоматизированный

Если модификация передаваемых команд следует избегать, другая специальная переменная может быть использована. Он называется BASH_ENV и обозначает сценарий для источника при запуске неинтерактивного сеанса. При этом возникает стратегия, аналогичная --rcfile.

> echo 'GLOBIGNORE=*t*' > rc 
> BASH_ENV=rc bash -c "echo *" 

Или, чтобы быть еще более запущенным и избежать временного файла rc, мы можем заставить трубопровод, который явно не предназначен в качестве значения - не рассматривается в качестве стандартного ввода.

> echo 'GLOBIGNORE=*t*' | BASH_ENV=/dev/stdin bash -c "echo *" 
Смежные вопросы