【问题标题】:Bash function does not return value since it seems to run in parallel [duplicate]Bash函数不返回值,因为它似乎并行运行[重复]
【发布时间】:2019-05-09 16:55:22
【问题描述】:

在一个函数中,我试图从一行文本中提取进程 ID。另外,我正在尝试返回该进程 ID:

#!/bin/bash

regex="[a-z]* ([0-9]+)  .*"
indexRawRow="sahandz 9040  other stuff comes here"
getPidFromRow() {

        if [[ $1 =~ $regex ]]
        then
                pid=${BASH_REMATCH[1]}
        else
                pid=""
        fi

        echo "pid is $pid inside function"

        return $pid
}

processId=$(getPidFromRow "$indexRawRow")

echo "pid is $processId outside of function"

输出是:

pid is pid is 9040 inside function outside of function

这里有几个问题:

  1. 两条 echo 语句似乎交织在一起,表明函数和主作用域是并行运行的。这应该发生吗?可以关掉吗?
  2. 外部范围永远不会获取进程 ID 的值。如您所见,它只打印一次。通过测试,我知道打印进程ID 9040的只是函数内部的echo。外部范围似乎没有得到进程ID。

这些问题的原因是什么?

【问题讨论】:

  • outside of function 来自哪里?
  • 是什么产生了文本outside of function?这里没有并行运行。 $(...) 等待函数完成,然后将其标准输出用作分配给processID 的值。如果要退出状态,在函数退出后查看$?的值。
  • 一般来说,您不会像在其他语言中那样使用return。它只能用于产生 0 到 255 之间的退出状态,而不是任意值。
  • 如果你想写一些作为信息日志的东西,它属于 stderr,而不是 stdout。您写入标准输出的所有内容都是输出,因此在命令替换中被捕获并(在当前情况下)分配给变量processId
  • @Barmar:抱歉,我的编辑出现了错误。我已经更正了 bash 脚本,以便它生成与我指定的输出相同的输出

标签: bash


【解决方案1】:

您的假设在这里很复杂,您在$(..) 的输出中看到的变量processIdecho 语句的输出,不是return-ed函数的值。

您根本无法从bash 中的函数返回字符串。只是来自0-255 的无符号整数代码。如果您要从函数中仅返回匹配组,请省略 return 语句并仅打印匹配组

getPidFromRow() {
    # Your other code here
    # ..
    printf '%d\n' "$pid"
}

【讨论】:

  • 有一个尾随换行符并因此输出是有效的 UNIX 文本行可能是一种很好的形式(然后将通过命令替换正确剥离,但这样其他成语像 read value < <(getPidFromRow) 工作)。
  • 如果匹配失败,我还建议返回非零(错误)状态。
猜你喜欢
  • 1970-01-01
  • 2021-07-31
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2011-09-08
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多