如何获取STDIN并在bashshell上使用它来设置环境变量



我正在努力改进这里的一行代码,这就是我目前所拥有的。

$ 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不同。

相关内容

  • 没有找到相关文章

最新更新