Dev*_*lus 52 shell bash path environment-variables
我正在尝试使用 MingW 编译 wxWidgets,并且我的路径中有 cygwin,这似乎有冲突。所以我想/d/Programme/cygwin/bin从 PATH 变量中删除,我想知道是否有一些优雅的方法来做到这一点。
天真的方法是将其回显到文件中,手动删除它并获取它,但我敢打赌有更好的方法。
tus*_*r08 41
没有标准工具可以“编辑” $PATH 的值(即“仅当文件夹不存在时才添加文件夹”或“删除此文件夹”)。你只需执行:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
Run Code Online (Sandbox Code Playgroud)
这将用于当前会话,如果您想永久更改,请将其添加到任何 .bashrc、bash.bashrc、/etc/profile - 任何适合您的系统和用户需求的文件。但是,如果您使用的是 BASH,您也可以执行以下操作,假设您想/home/wrong/dir/从 PATH 变量中删除该目录,假设它位于末尾:
PATH=$(echo "$PATH" | sed -e 's/:\/home\/wrong\/dir$//')
Run Code Online (Sandbox Code Playgroud)
所以在你的情况下你可以使用
PATH=$(echo "$PATH" | sed -e 's/:\/d\/Programme\/cygwin\/bin$//')
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 25
在 bash 中:
directory_to_remove=/d/Programme/cygwin/bin
PATH=:$PATH:
PATH=${PATH//:$directory_to_remove:/:}
PATH=${PATH#:}; PATH=${PATH%:}
Run Code Online (Sandbox Code Playgroud)
如果不使用中间变量,则需要保护/要删除的目录中的字符,以免它们被视为搜索文本的结尾。
PATH=:$PATH:
PATH=${PATH//:\/d\/Programme\/cygwin\/bin:/:}
PATH=${PATH#:}; PATH=${PATH%:}
Run Code Online (Sandbox Code Playgroud)
第一行和第三行用于安排搜索路径的每个组件都被 包围:,以避免特殊情况下第一个和最后一个组件。第二行删除指定的组件。
小智 18
更简单的一个班轮。
export PATH=`echo $PATH | tr ":" "\n" | grep -v "蟒蛇" | tr "\n" ":"`
Mar*_*oth 15
在考虑了此处提供的其他选项后,并没有完全理解其中一些是如何工作的,我开发了自己的path_remove函数,并将其添加到我的.bashrc:
function path_remove {
# Delete path by parts so we can never accidentally remove sub paths
PATH=${PATH//":$1:"/":"} # delete any instances in the middle
PATH=${PATH/#"$1:"/} # delete any instance at the beginning
PATH=${PATH/%":$1"/} # delete any instance in the at the end
}
Run Code Online (Sandbox Code Playgroud)
这最终非常接近Gilles 的解决方案,但被包装为一个可以在命令行上轻松使用的 bash 函数。
它的优点是作为 bash 函数,它像程序一样工作,无需成为路径上的程序,并且不需要任何外部程序运行,只需要 bash 字符串操作。
它看起来非常健壮,特别是它不会somepath:mypath/mysubpath变成somepath/mysubpath:if you run path_remove mypath,这是我以前的path_remove函数遇到的问题。
可以在高级 Bash 脚本指南 中找到有关 bash 字符串操作如何工作的极好解释。
因此,结合@gilles 和@bruno-a(以及其他一些 sed 技巧)的答案,我想出了这个单行代码,它将从 PATH 中删除(每个)REMOVE_PART,无论它是否出现在开头, PATH 的中间或结尾
PATH=$(REMOVE_PART="/d/Programme/cygwin/bin" sh -c 'echo ":$PATH:" | sed "s@:$REMOVE_PART:@:@g;s@^:\(.*\):\$@\1@"')
Run Code Online (Sandbox Code Playgroud)
这有点笨拙,但能够一击完成是件好事。该;用于连接在一起的两个单独的sed的命令:
s@:$REMOVE_PART:@:@g(替换:$REMOVE_PART:为单个:)s@^:\(.*\):\$@\1@ (它去掉了我们用 echo 命令添加的前导和尾随冒号)并且沿着类似的路线,我刚刚设法想出了这个单行代码,用于将 ADD_PART 添加到 PATH,仅当 PATH 尚未包含它时
PATH=$(ADD_PART="/d/Programme/cygwin/bin" sh -c 'if echo ":$PATH:" | grep -q ":$ADD_PART:"; then echo "$PATH"; else echo "$ADD_PART:$PATH"; fi')
Run Code Online (Sandbox Code Playgroud)
echo "$PATH:$ADD_PART"如果要将 ADD_PART 添加到 PATH 的末尾而不是开头,请将最后一部分更改为。
...
...或者为了更容易,创建一个remove_path_part包含内容的脚本
echo ":$PATH:" | sed "s@:$1:@:@g;s@^:\(.*\):\$@\1@"
Run Code Online (Sandbox Code Playgroud)
和一个prepend_path_part用内容调用的脚本
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$1:$PATH"; fi
Run Code Online (Sandbox Code Playgroud)
和一个append_path_part用内容调用的脚本
if echo ":$PATH:" | grep -q ":$1:"; then echo "$PATH"; else echo "$PATH:$1"; fi
Run Code Online (Sandbox Code Playgroud)
使它们都可执行,然后像这样调用它们:
PATH=$(remove_path_part /d/Programme/cygwin/bin)PATH=$(prepend_path_part /d/Programme/cygwin/bin)PATH=$(append_path_part /d/Programme/cygwin/bin)整洁,即使我自己这么说:-)
小智 6
此方法处理起始/结束路径分隔符:
echo $PATH | sed 's/:/\n/g' | grep -v <path description> | xargs | tr ' ' ':'
Run Code Online (Sandbox Code Playgroud)
解释:
echosed用换行符替换 ':'的 $PATH var
grep 输出并删除与我们的查询匹配的行
xargs 用空格替换换行符的输出
tr 用冒号替换空格的输出
xargs 处理尾随值的修剪
链接一些greps 以删除一堆路径
| 归档时间: |
|
| 查看次数: |
215194 次 |
| 最近记录: |