【问题标题】:how to remove a path from LD_LIBRARY_PATH in tcsh?如何从 tcsh 中的 LD_LIBRARY_PATH 中删除路径?
【发布时间】:2012-06-22 13:39:03
【问题描述】:

在退出/卸载包时,我必须通过从中删除某个路径来将LD_LIBRARY_PATH 重置为之前的设置。如何在 tcsh 或 csh 中做到这一点?

edit1 澄清一下。

假设LD_LIBRARY_PATH 类似于path1:mypath:path2:path3:path4,我不知道(在我的脚本中)除了它必须包含mypath,[begin edit2 存储在变量$MY_PATH end edit2] 某处。然后我想删除mypath,这样操作后LD_LIBRARY_PATH就是path1:path2:path3:path4

【问题讨论】:

    标签: linux path shared-libraries


    【解决方案1】:

    我是 bash 用户,但我很确定这会为您完成这项工作。它通常会在$LD_LIBRARY_PATH 中留下::,但这不会造成任何问题。

    setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[$DIR_TO_REMOVE][]g;"`
    

    对于可能遇到此问题的 bash 用户,请使用以下命令:

    LD_LIBRARY_PATH=$(echo $LD_LIBRARY_PATH | perl -pe "s[$DIR_TO_REMOVE][]g;")
    export LD_LIBRARY_PATH
    

    【讨论】:

    • +1 似乎可行,虽然我不是 perl 人,所以也许你可以向我解释一下 's' 和 'g' 的意思。
    • s[][](通常写成s///,但我使用了不同的变体,因为 / 出现在路径中)是正则表达式替换运算符。请参阅perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators g 是一个修饰符,意思是“进行多次替换”,在同一链接中讨论。我认为您的路径有可能多次出现在 $LD_LIBRARY_PATH 中,并且您希望删除每个实例。
    • 当我在另一个环境变量中有要删除的路径时,我怎样才能让它工作?我试过echo $LD_LIBRARY_PATH | perl -pe 's[$MYPATH][]g;',但这不起作用,大概是因为引号。
    【解决方案2】:

    我会将此作为 评论 添加到罗伯特的回答中,但我没有 50 名声望。然而。 (提示:可以帮助解决这个问题!;-)

    我是 csh 用户(不是自愿),因此非常感谢罗伯特的回答。但是使用的正则表达式容易匹配部分路径元素,例如,如果LD_LIBRARY_PATH = path1:mypath:path2:path3:path4,那么...

    setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[/ath][]g;"`
    

    ... 将产生LD_LIBRARY_PATH = p1:my:p2:p3:p4

    基于 robert 的回答,我修改了正则表达式以确保仅匹配路径字符串中的完整元素,并进行了多次替换以处理 DIR_TO_REMOVE 发生在路径开头、中间或结尾的情况.我还添加了一个替换来清理前导冒号(或路径只有“:”)和双冒号(“::”)。我无法弄清楚如何安全地删除尾随冒号,因为 csh 解析器将$ 作为 EOF 的元字符(或字符串结尾,在这种情况下)处理起来很痛苦。 (http://www.grymoire.com/Unix/CshTop10.txt

    我已经将它实现为一个接受命令行参数的 csh 别名,因为我想将它与 PATH、LD_LIBRARY_PATH 等一起使用。第一个参数是要修改的路径变量的名称。第二个参数是要替换的路径元素,第三个参数是新的路径元素(或“”来简单地删除与第二个参数匹配的路径元素)。

    我知道 Walter 的问题是如何删除 路径,但由于删除实际上只是替换为空值,这仍然回答了这个问题。为了我自己的使用,我安装了不同的工具链(例如,GCC 4.1.2、GCC 4.8.1、ICPC 2013)并且需要轻松地换入/换出路径到适当的二进制文件、库和包含给定的工具链,但对构建管理系统保持透明。

    代码如下:

    alias repath 'setenv \!:1 `echo $\!:1\: | perl -pe "s[^\!:2\:][\!:3\:]g; s[\:\!:2\:][\:\!:3\:]g; s[\:\:][\:]g; s[^\:][]g;"` '
    

    在 csh 终端会话中安全地测试它,如下所示:

    setenv myTestPath /myLDpath
    setenv myTestPath2 /myLDpath/x86_64
    setenv myTestPath3 /myLDpathDebug
    
    setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath}:${myTestPath2}:${myTestPath3}
    echo "        Starting with the following path-variable content ..."
    printenv testPATH
    echo "        Remove $myTestPath from the middle ..."
    repath testPATH $myTestPath ""
    printenv testPATH
    echo "        Put $myTestPath at the beginning ..."
    setenv testPATH ${myTestPath}:/SOME/PATH:/SOME/OTHER/PATH:${myTestPath2}:${myTestPath3}
    printenv testPATH
    echo "        and remove it from the beginning ..."
    repath testPATH $myTestPath ""
    printenv testPATH
    echo "        Put $myTestPath at the end ..."
    setenv testPATH /SOME/PATH:/SOME/OTHER/PATH:${myTestPath3}:${myTestPath2}:${myTestPath}
    printenv testPATH
    echo "        and remove it from the end ..."
    repath testPATH $myTestPath ""
    printenv testPATH
    echo "        Replace $myTestPath3 with /myLDpath/Debug ..."
    repath testPATH $myTestPath3 "/myLDpath/Debug"
    printenv testPATH
    echo "        Done!"
    

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-26
      • 1970-01-01
      相关资源
      最近更新 更多