2009-09-07 47 views
0

我的.bashrc中看起来是这样的......隐藏bash函数内部构件

export PERL5LIB="/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi" 
export PERL5LIB="${PERL5LIB}:/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0" 

function dev { 
    export PERL5LIB="/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi" 
    export PERL5LIB="${PERL5LIB}:/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0" 
} 

的问题是,当我用grep的PERL5LIB是看到的一切。

> env | grep PERL 
PERL5LIB=/tools/perl/Linux/x86_64/lib/perl5/5.10.0/x86_64-thread-multi:/tools/perl/Linux/x86_64/lib/perl5/5.10.0 
export PERL5LIB="/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0/${PLAT}-thread-multi"; 
export PERL5LIB="${PERL5LIB}:/dev/tools/perl/Linux/${PLAT}/lib/perl5/5.10.0"; 

所以它正在拾取我的“dev”函数内部的东西。有没有办法隐藏一个函数的内容?或者我只是需要习惯getenv ..旧习惯很难打破..

+0

你确定你正在运行 “ENV”,而不是 “套”? env只显示环境,而不是bash函数。 – camh 2009-09-07 04:48:25

+0

积极。我一直输入它! env | grep XYZ。问题是我的.bash_profile已经增长,并且很难解析。 – rh0dium 2009-09-07 04:51:46

+0

很高兴你知道发生了什么 - 你会介意解释问题出在什么地方吗? – 2009-09-13 05:49:31

回答

1

在您的bash提示符下运行type env,并提供输出;对我来说,这表明env是/usr/bin/env,一个单独的可执行文件;这样的可执行文件无法知道有关函数或非导出变量的任何信息。

这就是说,如果没有解决底层问题(可能的原因是使用bash内置函数或别名代替类型命令的输出将显示的/usr/bin/env),可以使用以下解决方法:env | grep '^PERL' ;该符号将仅发出以PERL开头的行(与线路中任何地方的PERL相反),并且函数内容将在set的输出中缩进(它似乎在运行而不是env;再次,type env应该给出原因的线索)。

澄清的一点:set是一个bash内建函数,它在没有参数的情况下运行时会转储定义的变量(环境或其他)和函数;当运行参数时,它有一些完全不同的(和POSIX指定的)行为。作为外部程序,env不能访问未导出的变量或在调用它的shell中定义的函数。 (设置实际上不是bash特定的,而是specified by POSIX转储所有shell变量;其转储函数定义的附加功能在我所知的范围内是标准字母之外的扩展)。

+0

env是/ usr/local/bin/env – rh0dium 2009-09-08 23:00:06

+0

你能解释你的第二个评论WRT“set of set”吗?谢谢 – rh0dium 2009-09-08 23:01:34

+1

...这是'type'的输出,而不是'which'?如果真正调用的是'/ usr/local/bin/env',那么它无法知道你定义的shell函数是什么,因此也没有办法转储它们。 – 2009-09-10 05:29:42

1

尝试:

(set -o posix ; set) 
+1

我想你可以通过函数和别名获得一些乐趣让'env'在没有参数的情况下调用该序列 - 但据我所知,这里的目标是想出一种方法让rh0dium获得所需的行为*不改变他的习惯*(因此他习惯用管道命令)。 – 2009-09-07 17:21:16