134
|
Ben Blank Jarret Hardie · 技术社区 · 16 年前 |
![]() |
1
62
我的肮脏的黑客:
|
![]() |
2
57
一分钟与awk:
编辑:它回应了以下评论:
针对安全问题进行编辑:(与问题无关)
这将删除最后一个条目留下的任何尾随冒号,这将有效地添加
|
![]() |
3
47
既然替代的大问题是最终案例,那么让最终案例与其他案例没有区别怎么样?如果路径的开头和结尾已经有冒号,我们可以简单地搜索用冒号包裹的所需字符串。事实上,我们可以很容易地添加这些冒号并在之后删除它们。
纯bash:)。 |
![]() |
4
27
以下是我能想到的最简单的解决方案:
上面的示例将删除$PATH中包含“usr”的任何元素。您可以将“*usr*”替换为“/home/user/bin”来删除该元素。 更新 每 sschuberth
尽管我认为空间
或
|
![]() |
5
13
这是一条单行线,尽管水流湍急 accepted 和 highest rated 答案,不会向PATH添加不可见字符,并且可以处理包含空格的路径:
就我个人而言,我也觉得这很容易阅读/理解,它只涉及常见的命令,而不是使用awk。 |
![]() |
6
9
以下是一个解决方案:
|
![]() |
7
6
我刚刚开始使用bash发行版中的函数,这些函数显然自1991年以来就存在了。这些仍然在Fedora上的bash-docs包中,过去用于
|
![]() |
8
6
从我的.bashrc文件中把它挖出来。 当你使用PATH时,如果它丢失了,awk/sed/grep将不可用:-) |
![]() |
9
5
到目前为止,我找到的最好的纯bash选项如下:
这是基于 not quite correct answer 向 Add directory to $PATH if it's not already there 在Superuser上,修复了评论中提到的问题。 显然,如果你不想要解释性注释,这可以做成一个单行函数。 |
![]() |
10
4
Linux from Scratch定义了三个Bash函数
裁判: http://www.linuxfromscratch.org/blfs/view/svn/postlfs/profile.html |
![]() |
11
3
好吧,在bash中,由于它支持正则表达式,我会简单地这样做:
|
![]() |
12
2
我确实写了一个答案 here (也使用awk)。但我不确定这就是你要找的吗?至少在我看来,它的作用很明显,而不是试图放在一条线上。不过,对于一个只去除东西的简单单行线,我建议
更换是
或(较短但可读性较差)
不管怎样,对于同一个问题和许多有用的答案,请参阅 here . |
![]() |
13
2
我喜欢@BenBlank对其原始问题的更新中显示的三个功能。为了推广它们,我使用了一个2参数形式,它允许我设置PATH或任何其他我想要的环境变量:
使用示例:
请注意,我还添加了一些引号,以便正确处理包含空格的路径名。 |
![]() |
14
1
还有什么比awk更优雅的呢?
python这是一个更具可读性和可维护性的解决方案,很容易检查它是否真的在做你想做的事情。 假设你想删除第一个路径元素?
(而不是管道
类似于从末尾删除:
例如,要制作这些可重用的shell函数,可以将其放入.bashrc文件中:
|
![]() |
15
1
是的,例如,在PATH末尾加一个冒号,可以让删除路径变得不那么笨拙;容易出错。
|
![]() |
16
1
如果您担心删除 副本 在$PATH中,依我之见,最优雅的方式是一开始就不添加它们。1行:
$文件夹可以被任何东西替换,并且可能包含空格(“/home/user/my documents”) |
![]() |
17
1
我迄今为止发现的最优雅的纯bash解决方案:
|
![]() |
18
1
大多数其他建议的解决方案只依赖于字符串匹配,不考虑包含特殊名称的路径段,如
测试:
|
![]() |
19
1
我知道这个问题问的是BASH,每个人都应该更喜欢它,但由于我喜欢对称性,有时我需要使用“csh”,我构建了与上面的“path_prepend()”、“path_append()”和“path_remove()”优雅解决方案等效的解决方案。 要点是“csh”没有函数,所以我在我的个人bin目录中放了一些像函数一样的shell脚本。我为SOURCE这些脚本创建别名,以对指定的环境变量进行更改。 ~/bin/_path_remove.sch:
~/bin/_path_append.csh:
~/bin/_path_prepend.csh:
~/bin/.cshrc:
你可以这样使用它们。..
|
![]() |
20
0
由于这往往很成问题,因为没有优雅的方法,我建议通过重新安排解决方案来避免这个问题:建立你的PATH,而不是试图将其拆除。 如果我知道你真正的问题背景,我可以说得更具体。在此期间,我将使用软件构建作为上下文。 软件构建的一个常见问题是,它在某些机器上会崩溃,最终是由于有人配置了默认shell(PATH和其他环境变量)。优雅的解决方案是通过完全指定shell环境使您的构建脚本免疫。编写构建脚本,根据您控制的组装部分(如编译器、库、工具、组件等的位置)设置PATH和其他环境变量。将每个可配置项设置为可以单独设置、验证,然后在脚本中适当使用的内容。 例如,我在新雇主那里继承了一个基于Maven的WebLogic目标Java构建。构建脚本以脆弱而臭名昭著,我和另一名新员工花了三个星期(不是全职,只是在这里和那里,但仍然有很多小时)让它在我们的机器上工作。一个重要的步骤是,我控制了PATH,这样我就可以确切地知道正在调用哪个Java、哪个Maven和哪个WebLogic。我创建了环境变量来指向这些工具中的每一个,然后我根据这些变量和其他一些工具计算了PATH。类似的技术驯服了其他可配置的设置,直到我们最终创建了一个可复制的构建。 顺便说一句,不要使用Maven,Java是可以的,只有当你绝对需要它的集群时才购买WebLogic(否则就不行,尤其是不是它的专有功能)。 最美好的祝福。 |
![]() |
21
0
与@litb一样,我为这个问题提供了答案 How do I manipulate $PATH elements in shell scripts “所以我的主要答案就在那里。
中的“拆分”功能
只要$PATH中没有空格,它就可以正常工作。让它适用于包含空格的路径元素是一项不平凡的练习,留给感兴趣的读者。使用Perl等脚本语言处理它可能更简单。
我也有一个剧本,
|
![]() |
22
0
让这个问题令人恼火的是第一个和最后一个元素之间的围栏案例。通过更改IFS和使用数组可以很好地解决这个问题,但我不知道如何在路径转换为数组形式后重新引入冒号。
这是一个稍微不那么优雅的版本,它从中删除了一个目录
|
![]() |
23
0
这是一个Perl单行代码:
这个
|
![]() |
24
0
这里有好东西。 我用这个来防止一开始就添加欺骗。
|
![]() |
25
0
启用扩展全局搜索后,可以执行以下操作:
|
![]() |
26
0
加长球形内衬(嗯,有点):
似乎没有必要逃避1美元的大幅削减。
|
![]() |
27
0
在PATH中添加冒号,我们还可以执行以下操作:
|
![]() |
28
0
在path_remove_all(通过proxxy)中:
|
![]() |
29
0
虽然这是一个非常古老的话题,但我认为这个解决方案可能会引起人们的兴趣:
在这上面找到的 blog post 。我想我最喜欢这个:) |
![]() |
30
0
我采取了一种与这里大多数人略有不同的方法,专门关注字符串操作,如下所示:
以上是我使用的最终函数的简化示例。我也创造了
全套功能可在 path_helpers.sh 在我的 dotfiles 。它们完全支持在PATH字符串的开头/中间/末尾删除/附加/预置/插入。 |