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

如何获取STDIN并在bashshell上使用它来设置环境变量?,bash,path,sed,xargs,env,Bash,Path,Sed,Xargs,Env,我正在努力在一行程序上做得更好,这就是我目前拥有的 $ echo $PATH /home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games 我想做的是去掉第一块,这是我到目前为止发现的--- 这里我最不想做的事情就是把它放回PATH,比如export PATH=[结果] 我尝试的方式如下,但我无法工作--- 另外,顺便说一句,另一个让我困惑的问题是上面的sed表达式,由于某种原因

我正在努力在一行程序上做得更好,这就是我目前拥有的

$ echo $PATH
/home/ubuntu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
我想做的是去掉第一块,这是我到目前为止发现的---

这里我最不想做的事情就是把它放回PATH,比如export PATH=[结果]

我尝试的方式如下,但我无法工作---

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

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


export
是一个内置的shell;这就是为什么不能通过
xargs
直接执行它(没有用于
export
的可执行文件)。这将运行编辑脚本并将该值设置为
$PATH
的新值。正如在
$PATH
周围用双引号所写的那样,即使路径元素中有多个相邻空格,它也能工作(可能性不大,但确保它正常工作并没有坏处)。

这更简单、更准确:

echo "$PATH" | sed -e s/[^:]*://
那里的正则表达式更精确,即使第一段中有数字或空格,它也可以工作

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

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

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

在我看来,
sed
中的正则表达式的工作原理类似于
vim
,不同于
perl

,我认为解决这个特定问题的最佳方法是:

export PATH=${PATH#*:}
但这并不能回答如何使用
stdin
设置环境变量的问题

使用一些进程“
stdout
”很容易:

export PATH=$(make_new_path)
但严格来说,这并不是使用
stdin
。显而易见的解决方案是:

make_new_path | export PATH=$(cat)
不起作用,因为管道右侧的命令在子shell中执行,所以变量设置不会保持不变。(如果它起作用的话,它将是一个UUOC。)

正如戈登·戴维森(Gordon Davidson)在评论中指出的,你可以简单地使用:

read -r PATH; export PATH

另外,实际上没有必要导出路径,因为路径是预先导出的,但是我保留了它,以便您使用其他环境变量。

echo$var
echo“$var”
是相同的。你不需要这些引语。另外,
z=$(echo a b)
z=“$(echo a b)”
z=“$(echo a b”)”
@janos,
echo“$var”
echo$var
有很大不同——你可以自己用
var='*'
试试,或者更巧妙地用
var=“两个空格”
(单词之间有两个空格)。bash允许您省略变量赋值的双引号。@glennjackman该死,您说得对!我还忽略了“多个相邻空格”这一点,我的错,谢谢你的留言!如果他真的想使用脚本的STDIN,而不是某个命令的STDOUT,那么正确的使用方法应该是
读取路径
——但这根本不是这里所需要的。@GordonDavisson:这一点很好。我会解决的。这不是这里所需要的,但它是问题的标题。如果你想变得可笑(并且与bash之外的任何东西都不兼容),你可以使用进程重定向:
read PATH<+1我认为他真的是指STDOUT,并且错误地编写了STDIN。你正确地回答了意图,而不是字面上的问题。您还添加了
read-r
选项,这也很好。
export PATH=${PATH#*:}
export PATH=$(make_new_path)
make_new_path | export PATH=$(cat)
read -r PATH; export PATH