如何在不在子 shell 中运行命令的情况下将命令的输出分配给变量?

Tal*_*Tal 5 bash shell-script variable

如果我有这样的功能:

TEST()
{
    if [[ "$1" == "hi" ]]
    then
        exit 1
    fi

    echo "Some text"
}
Run Code Online (Sandbox Code Playgroud)

如果我在当前 shell 中运行该函数:

TEST "hi"
Run Code Online (Sandbox Code Playgroud)

一切都按预期工作。函数中的 if 语句为真,整个脚本将退出。另一方面,如果我这样做:

FUNCTION_OUTPUT=$(TEST "hi")
Run Code Online (Sandbox Code Playgroud)

这样我就可以在变量中从函数中捕获标准输出,函数内的 if 语句仍然为真,“exit 1”仍将触发,但由于我们在子 shell 中运行,脚本将继续运行。

不是使用 VAR_NAME=$() 在子shell中运行某些东西并将其分配给变量,有没有办法在当前shell中运行它,以便我的函数中的“exit 1”行实际上退出整个脚本?

cuo*_*glm 4

变量赋值只是一个简单的命令,因此您可以使用if 条件来检查函数是否成功或失败:

if ! FUNCTION_OUTPUT=$(TEST hi); then
  echo Function return non-zero status
  exit 1
fi

# This line never printed
printf '%s\n' "$FUNCTION_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

如果函数成功,您将获得FUNCTION_OUTPUT包含函数结果的变量:

if ! FUNCTION_OUTPUT=$(TEST hii); then
  echo Function return non-zero status
  exit 1
fi

# Output content of FUNCTION_OUTPUT
printf '%s\n' "$FUNCTION_OUTPUT"
Run Code Online (Sandbox Code Playgroud)

  • 除此之外,该函数应该有“return 1”而不是“exit 1”,这样无论是否在子 shell 中调用,其行为都是完全相同的。调用者应该检查返回值,就像调用者应该检查它调用的外部程序的返回值一样(如果该返回值很重要) (4认同)