Linux 如何在tcsh中从LD_LIBRARY_path中删除路径?

Linux 如何在tcsh中从LD_LIBRARY_path中删除路径?,linux,path,shared-libraries,Linux,Path,Shared Libraries,退出/卸载软件包时,我必须通过从中删除某个路径,将LD_LIBRARY_路径重置回以前的设置。在tcsh或csh中如何做到这一点 编辑1澄清 假设LD_LIBRARY_PATH类似于path1:mypath:path2:path3:path4,我(在我的脚本中)除了它必须包含mypath,[begin edit2,它存储在变量$my_PATHend edit2]的某个地方之外,什么都不知道。然后我想删除mypath,这样在操作之后LD\u LIBRARY\u PATH就是path1:path2:

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

编辑1澄清


假设
LD_LIBRARY_PATH
类似于
path1:mypath:path2:path3:path4
,我(在我的脚本中)除了它必须包含
mypath
,[begin edit2,它存储在变量
$my_PATH
end edit2]的某个地方之外,什么都不知道。然后我想删除
mypath
,这样在操作之后
LD\u LIBRARY\u PATH
就是
path1:path2:path3:path4
我是一个bash用户,但我很确定这会帮你完成这项工作。它通常会在
$LD\u LIBRARY\u路径中留下
,但这不会导致任何问题

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

我本想在罗伯特的回答中加上这句话作为评论,但我没有50%的声誉。然而(提示:您可以帮助解决此问题!;-)

我是csh用户(不是自愿的),所以非常感谢robert的回答。但是使用的正则表达式易受匹配部分路径元素的影响,例如,如果
LD_LIBRARY\u path=path1:mypath:path2:path3:path4
,则

setenv LD_LIBRARY_PATH `echo $LD_LIBRARY_PATH | perl -pe "s[/ath][]g;"`
。。。将产生
LD\u LIBRARY\u PATH=p1:my:p2:p3:p4

基于robert的回答,我修改了正则表达式,以确保只匹配路径字符串中的完整元素,并添加了多个替换来处理DIR_to_REMOVE发生在路径开头、中间或结尾的情况。我还添加了一个替换来清除前导冒号(或路径仅为“:”)和双冒号(“:”)。我不知道如何安全地删除尾随冒号,因为csh解析器很难将
$
作为EOF的元字符(在本例中是字符串结尾)处理。(见附件)

我将其实现为一个接受命令行参数的csh别名,因为我想将其与PATH、LD_LIBRARY_PATH等一起使用。第一个参数是要修改的PATH变量的名称。第二个参数是要替换的path元素,第三个参数是新的path元素(或“”以简单地删除与第二个参数匹配的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!"

+1虽然我不是perl爱好者,但这似乎是可行的,所以也许您可以向我解释“s”和“g”的含义。
s[][]]
(通常编写
s///
,但我使用了另一个变体,因为/出现在路径中)是正则表达式替换运算符。参见
g
是一个修饰语,意思是“进行多次替换”,在同一链接中讨论。我认为您的路径可能多次出现在
$LD\u LIBRARY\u path
中,并且您希望删除每个实例。当我在另一个环境变量中有要删除的路径时,如何才能使其正常工作?我尝试了
echo$LD_LIBRARY_PATH | perl-pe的[$MYPATH][]g;',但这不起作用,可能是因为引号的缘故。