将程序的输出日志传递给函数,同时将 return 代码存储在变量中

Pass output logs from a program into a function and store the return code in a variable at the same time

我有一个 shell 脚本,它具有记录语句的功能。 SomeProgram 是来自我的 shell 脚本的 运行 的另一个程序,它的日志被传递到函数 LogToFile.

#!/bin/sh

LogToFile() {
    [[ ! -t 0 ]] && while read line; do echo "$line" >> $MY_LOG_FILE; done
    for arg; do echo "$arg" >> $MY_LOG_FILE; done
}

SomeProgram | LogToFile

问题:
一切都很好,直到这里。但是我一直在尝试从 SomeProgram 获取 return 代码并将其存储在变量中。我怎样才能做到这一点而不失去 SomeProgram 进入我的 LogToFile 函数的日志功能。我尝试了以下选项但徒劳无功。

RETVAL=SomeProgram | LogToFile
RETVAL=(SomeProgram) | LogToFile
RETVAL=(SomeProgram | LogToFile)

是否可以将程序的输出传递给函数参数,同时将return值收集到另一个变量中?

我终于明白了。 PIPESTATUS是这里要用到的工具。

以下是我可以使用它来将 SomeProgram 的 return 代码转换为 RETVAL 的方法。

SomeProgram | LogToFile
RETVAL=${PIPESTATUS[0]}

以上是管道左边程序输出的获取方式。 PIPESTATUS是一个数组,里面包含了所有运行与管道命令相邻的程序的return代码。

PIPESTATUS[1] 可以给出 LogToFile 的输出,例如,如果 LogToFile 是一个程序。