4

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

编辑1澄清。

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

4

2 回答 2

4

我是 bash 用户,但我很确定这会为您完成这项工作。它通常会留下一个::in $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
于 2012-06-20T13:47:39.977 回答
2

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

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

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 等一起使用。第一个参数是要修改的路径变量的名称。第二个参数是要替换的路径元素,第三个参数是新的路径元素(或“”以简单地删除与第二个参数匹配的路径元素)。

我知道沃尔特的问题是如何删除路径,但由于删除实际上只是用空值替换,这仍然回答了这个问题。为了我自己的使用,我安装了不同的工具链(例如,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!"
于 2013-07-31T22:23:22.037 回答