【问题标题】:Function passing a variable into main Bash shell quirk [duplicate]将变量传递给主 Bash shell 怪癖的函数
【发布时间】:2021-12-12 06:03:45
【问题描述】:

我试图创建一个函数,将通过管道输入的所有文本都放入一个变量中。我遇到了一个问题。这是一个摘要,因此可以正常工作(打印“1”)。

#!/bin/bash
jkl(){
i=1
}
jkl
echo $i

但不是这个。

#!/bin/bash
jkl(){
i=1
}
echo hel | jkl
echo $i

这是怎么回事?

【问题讨论】:

  • 为什么说第一个有效?您没有将任何文本传送到jkl
  • 我想我设法弄清楚了你在说什么,即使你没有很好地解释它。我怀疑第二个示例中的jkl 函数无法成功设置i 变量,因为它可能在子shell 中运行。 stackoverflow.com/questions/23564995/…
  • 使用一堆运行命令来同步
  • 以下是关于在管道中设置变量的一些其他问答:"assign a value to a variable in a loop""Local variables after loop exit"。这些是关于循环而不是函数,但这根本不重要。重要的是它们在管道中,因此在子外壳中运行。
  • 这也是BashFAQ #24

标签: bash


【解决方案1】:

在某些情况下,Bash 会启动一个子 shell 来运行您的函数。如果这样做,则该函数无法为父 shell 设置变量。您可以写echo $BASH_SUBSHELL 来查看该代码是否在子shell 中运行。

这是一个演示问题的简单脚本:

#!/bin/bash
jkl() {
  echo $BASH_SUBSHELL
  i=$BASH_SUBSHELL
}
echo $BASH_SUBSHELL    # 0
jkl                    # 0
echo hel | jkl         # 1 - uses a subshell
echo $(jkl)            # 1 - uses a subshell
echo $i                # 0

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2015-01-08
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2011-11-18
    相关资源
    最近更新 更多