2013-06-05 2 views
0

У меня есть функция-оболочка, которая выполняет команду внутри суб-оболочки после установки некоторых переменных среды, например.Как я могу выполнить shell-скрипт в под-оболочке Bash?

$ with-env-overrides git status 

Это реализовано с использованием eval в суб-оболочки

with-env-overrides() { 
    (
    source $HOME/.env-overrides 
    eval "[email protected]" 
) 
} 

это означает, что я могу использовать псевдонимы и оболочки-функции, например,

$ with-env-overrides gs  

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

$ with-env-overrides grep "foo bar" /etc/passwd 
grep: bar: No such file or directory 

Как я могу добиться этого без использования eval, но без потери возможности использовать псевдонимы и т.д.?

ответ

2

Вы можете сделать то же самое, но без eval.

with-env-overrides() { 
    (
    source $HOME/.env-overrides 
    "[email protected]" 
) 
} 

Пример:

$ cat ~/.env-overrides 
export A=1000 
$ export | grep ^A= 
$ with-env-overrides export | ^grep A= 
declare -x A="1000" 

Как вы можете видеть, во втором случае, у вас есть окружение с переменной A.

+0

То, что я хотел бы предложить. – Samveen

+0

Хмм, к сожалению, я не могу использовать псевдонимы с помощью этого метода. –

+0

@MikeWilliams: Это правильно. Псевдонимы очень ограничены и имеют ряд странностей. Один из них заключается в том, что они действуют скорее как встроенные, чем команды, поэтому вы не можете процитировать их или построить из двух строк или развернуть параметр, чтобы вызвать его. Вместо этого используйте функции оболочки. – rici

Смежные вопросы