5

我正在努力在这里变得更好,这就是我目前所拥有的。

$ echo $PATH
/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

我想要做的是剥离第一块,所以这就是我到目前为止所想出的——

$ echo $PATH | sed -e "s|^/[A-Za-z/]*:||"
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

我在这里要做的最后一件事是将其放回 PATH,例如 export PATH=[that result]

我尝试过的方式如下,我无法开始工作---

$ echo $PATH | sed -e "s|^/[A-Za-z/]*:||" | xargs export PATH=
xargs: export: No such file or directory

另外,顺便说一句,让我感到困惑的另一个问题是上面的 sed 表达式,由于某种原因,当我尝试使用 + 而不是 * 时,它不会抓住第一位。看 - -

$ echo $PATH | sed -e "s|^/[A-Za-z/]+:||" 
/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

它就像 +,意思是“一个或多个”不如“许多”*。

4

3 回答 3

10

我认为该特定问题的最佳解决方案是:

export PATH=${PATH#*:}

但这并不能回答如何使用stdin来设置环境变量的问题。

使用某些过程很容易' stdout

export PATH=$(make_new_path)

但严格来说,这并不是使用stdin. 显而易见的解决方案:

make_new_path | export PATH=$(cat)

不起作用,因为管道右侧的命令在子shell中执行,因此变量设置不会粘住。(如果它成功了,它就会成为 UUOC。)

正如 Gordon Davisson 在评论中指出的那样,您可以简单地使用:

read -r PATH; export PATH

此外,实际上没有必要export PATH,因为PATH它是预先导出的,但我把它留给了你想使用其他环境变量的情况。

于 2013-07-09T07:07:15.913 回答
2
export PATH=$(echo "$PATH" | sed -e "s|^/[A-Za-z/]*:||")

export是一个内置的外壳;这就是为什么你不能直接通过xargs(没有可执行文件export)执行它。这将运行您的编辑脚本并将值设置为 的新值$PATH。正如用双引号写的那样$PATH,即使 PATH 的一个元素中有多个相邻的空格,它也可以工作(不太可能,但确保它正常工作没有害处)。

于 2013-07-09T06:29:04.157 回答
1

这是更简单和准确的一点:

echo "$PATH" | sed -e s/[^:]*://

那里的正则表达式更准确,即使第一段中有数字或空格,它也会起作用。

顺便说一句,您不需要导出,因为PATH已经导出。

正则表达式的实现取决于工具。据我所知+,在 中不起作用sed,您可以这样做:

echo "$PATH" | sed -e 's/[^:]\{1,\}://'

在我看来,正则表达式的sed工作方式vimperl.

于 2013-07-09T06:58:10.313 回答