【问题标题】:How can I take STDIN and use it on the bash shell to set an environment variable?如何获取 STDIN 并在 bash shell 上使用它来设置环境变量?
【发布时间】:2013-07-06 15:35:31
【问题描述】:

我正在努力在单线方面做得更好,这就是我目前所拥有的。

$ 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=[那个结果]

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

$ 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

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

【问题讨论】:

    标签: bash path sed xargs env


    【解决方案1】:
    export PATH=$(echo "$PATH" | sed -e "s|^/[A-Za-z/]*:||")
    

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

    【讨论】:

    • echo $varecho "$var" 是相同的。你不需要那些引号。此外,z=$(echo a b)z="$(echo a b)"z="$(echo "a b")" 相同。
    • @janos,echo "$var"echo $var 有很大不同——请自己尝试使用 var='*',或者更巧妙地使用 var="two spaces"(单词之间有 2 个空格)。 bash 允许您省略变量赋值的双引号。
    • @glennjackman 该死,你是对的!我也忽略了“多个相邻空格”位,我的错,感谢您的注意!
    【解决方案2】:

    这个比较简单准确一点:

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

    那里的正则表达式更准确,即使第一段有数字或空格也可以。

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

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

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

    在我看来,sed 中的正则表达式的工作方式类似于 vim,但与 perl 不同。

    【讨论】:

      【解决方案3】:

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

      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 是预先导出的,但我把它留给了你想使用其他环境变量的情况。

      【讨论】:

      • 如果他真的想使用脚本的 STDIN,而不是某些命令的 STDOUT,正确的使用方式是 read PATH——但这根本不是这里需要的。
      • @GordonDavisson:好点。我会解决的。这不是这里需要的,而是问题的标题。
      • 如果你想变得可笑(并且与 bash 以外的任何东西都不兼容),你可以使用进程重定向:read PATH < <(make_new_path)
      • +1 我认为他真正的意思是 STDOUT 并且错误地写了 STDIN。您正确地回答了 intent,而不是字面意义上的问题。很高兴您添加了read -r 选项。
      猜你喜欢
      • 2012-10-01
      • 2011-07-23
      • 2011-01-16
      • 2016-12-18
      • 2014-02-24
      • 2018-11-16
      • 2014-10-27
      • 2018-12-29
      • 1970-01-01
      相关资源
      最近更新 更多