【问题标题】:Using source to include part of a file in a bash script使用 source 在 bash 脚本中包含文件的一部分
【发布时间】:2014-03-04 21:53:08
【问题描述】:

我有一个 bash 脚本,它需要使用包含在单独文件中的一些变量。

通常,为了包含整个文件,我会在主脚本中使用 source otherfile.sh。 在这种情况下,我只需要使用该文件的一部分。我不能使用(包含)文件其余部分中包含的其余变量。

为了过滤配置文件的内容(比如说从标签“#start”到“#end”的例子),我使用 awk,但我无法将输出重定向到 soruce 命令。

在我的代码下面:

awk ' /'"# start"'/ {flag=1;next} /'"# end"'/{flag=0} flag { print }' config.sh

你知道有什么方法可以将此命令的输出重定向到源代码吗?有没有其他方法可以在运行时将输出包含在我的 bash 脚本中?

顺便说一句,我不想​​创建临时文件(看起来我太脏了......)..我已经尝试过在这个网站上找到的东西,但由于某些原因它不起作用。下面是我找到的解决方案。

awk ' /'"# start"'/ {flag=1;next} /'"# end"'/{flag=0} flag { print }' config.sh | source /dev/stdin

谢谢,

卢卡

【问题讨论】:

    标签: linux bash shell scripting


    【解决方案1】:

    source 可以从bash 中的进程替换中读取:

    source <( awk ' ... ' config.sh )
    

    sed 允许以更简单的方式获取行的子集:

    sed -n '/#start/,/#end/p' config.sh
    

    更新:这似乎只适用于bash 4 或更高版本。

    【讨论】:

    • 嗨 Chepner,我尝试执行上面的代码,但使用 'source
    • 奇怪。我试过source &lt;(echo foo=bar),它应该在当前shell中将foo的值设置为“bar”。它在bash 4.1 及更高版本中按预期工作。它在bash 3.2 中确实失败了,尽管在您第一次尝试报告时我没有看到任何错误消息。第二次尝试应该失败,因为您尝试使用 sed 的输出作为文件名,我认为这在语法上不正确。
    【解决方案2】:

    今天朋友提供的正确方法。代码如下:

    source /dev/stdin <<EOF
    $(awk ' /'"# 10.216.33.133 - start"'/ {flag=1;next} /'"# 10.216.33.133 - end"'/{flag=0} flag { print }' testbed.sh)
    EOF
    

    完美运行...感谢 Andrea! :)(当然每个人都试图回答)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-05
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      相关资源
      最近更新 更多