附加到 csh 中可能尚不存在的环境变量的简单方法

Posted

技术标签:

【中文标题】附加到 csh 中可能尚不存在的环境变量的简单方法【英文标题】:Simple way to append to an environment variable that may not exist yet in csh 【发布时间】:2018-05-23 04:38:46 【问题描述】:

我正在尝试将路径附加到我的 PERL5LIB 环境变量的末尾,但我不确定这个变量是否会一直存在。如果它不存在,我想简单地将其初始化为我尝试附加的值。

这是一个有效的例子:

if ( $?PERL5LIB ) then
    setenv PERL5LIB $PERL5LIB:/some/other/path
else
    setenv PERL5LIB /some/other/path
endif

虽然这行得通,但它看起来仍然很笨拙,因为我基本上必须将同一行写两次。我想做的是想出一个更有效的单线解决方案(可能使用参数扩展)。

有没有办法将它合并到一条线上? (或者几行不涉及多次写出“/some/other/path”)


例如,这可以在 bash 中完成:

export PERL5LIB=$PERL5LIB:+$PERL5LIB:/some/other/path

【问题讨论】:

P.S 我可以看到编辑修订以查看您的最后一次编辑偷了我的答案! 缺少的问号是错字。没有问号,问题中的代码根本无法工作,但直到我去写自己的答案时,我才意识到我把它遗漏了。 【参考方案1】:

由于缺乏更好的答案,我将发布我在问题中的稍微改进的版本。以下至少消除了两次写出路径...

set perl5lib = "/some/other/path"
if ( $?PERL5LIB ) then
    setenv PERL5LIB $PERL5LIB:$perl5lib
else
    setenv PERL5LIB $perl5lib
endif

虽然只是很小的改进,但至少是有的。

编辑:

从技术上讲,这可以缩短为:

set perl5lib = "/some/other/path"
[ $?PERL5LIB ] && setenv PERL5LIB $PERL5LIB:$perl5lib || setenv PERL5LIB $perl5lib

不是最易读的,但我想这和我能得到的一样好。

编辑 2:

可能更具可读性? ...我真的不知道。

set perl5lib = "/some/other/path"
[ $?PERL5LIB ] \
  && setenv PERL5LIB $PERL5LIB:$perl5lib \
  || setenv PERL5LIB $perl5lib

【讨论】:

由于没有更好的答案,我接受此作为答案...如果您有更好的答案,请随时发布,我会更改已接受的答案。 你知道大括号的使用是不必要的并且增加了复杂性, = 开始内联扩展和 = 结束内联扩展,因为你没有做任何你不应该做的表达式正在使用它们并浪费性能我认为您不知道计算机的复杂性和大小之间的区别。 @MartinBarker 这更多是关于代码重复,而不是实际的复杂性和性能。我只是不想多次写“/some/other/path”,因为当你对许多环境变量这样做时,其中一个错字并且不知道它的机会会变得更大。 另外我个人认为添加大括号可以提高可读性,这在这种情况下比性能更重要。【参考方案2】:

如果未定义环境变量,请将其设置为空字符串。这样可以避免重复。

if ( ! $?PERL5LIB ) then
        setenv PERL5LIB ""
else
        setenv PERL5LIB "$PERL5LIB:"
endif
setenv PERL5LIB $PERL5LIB/some/other/path

【讨论】:

如此简单...但不知何故我无法自己想出这个哈哈。 -1 这是错误的。如果未定义变量,则现在将其定义为:/some/other/path,其中包括两个路径,第一个是空路径。这可能会被某些程序解释为.,这可能非常糟糕。

以上是关于附加到 csh 中可能尚不存在的环境变量的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

仅当文件尚不存在时才将行附加到文件中

如何将值附加到尚不存在的键?

加载 .RData 文件中包含的对象(如果它们尚不存在)

linux shell脚本中如何引入当前的系统环境变量

如何为 csh/tcsh 中的一个命令设置环境变量

通过附加到新环境来检查 .rdata 文件的内容 - 可能吗?