我正在努力改进这里的一行代码,这就是我目前所拥有的。
$ 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中,比如导出PATH=[那个结果]
我试过的方法如下,但我无法工作---
$ 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
它就像+,意思是"一个或多个"不如"多个"*好用。
我认为这个特定问题的最佳解决方案是:
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
是预先导出的,但我保留了它,以备您想要使用其他环境变量时使用。
export PATH=$(echo "$PATH" | sed -e "s|^/[A-Za-z/]*:||")
export
是一个内置的外壳;这就是为什么不能通过xargs
直接执行它(export
没有可执行文件)。这将运行您的编辑脚本,并将该值设置为$PATH
的新值。正如在$PATH
周围用双引号写的那样,即使PATH的一个元素中有多个相邻的空格,它也能工作(这是不太可能的,但确保它正常工作也没有坏处)。
这更简单、更准确:
echo "$PATH" | sed -e s/[^:]*://
那里的正则表达式更准确,即使第一段中有数字或空格,它也能工作
顺便说一句,您不需要导出,因为PATH
已经导出。
正则表达式的实现取决于该工具。据我所知,+
在sed
中不起作用,你可以这样做:
echo "$PATH" | sed -e 's/[^:]{1,}://'
在我看来,sed
中的正则表达式的工作原理与vim
相似,但与perl
不同。