将退出代码分配给 shell 局部变量

60 shell bash command-substitution variable

#!/bin/bash
function0()
{
 local t1=$(exit 1)
 echo $t1
}

function0
Run Code Online (Sandbox Code Playgroud)

echo打印空值。我期望:

1
Run Code Online (Sandbox Code Playgroud)

为什么t1变量没有被分配退出命令的返回值 - 1

Ste*_*itt 78

local t1=$(exit 1) 告诉外壳:

  • exit 1在子shell中运行;
  • 将其输出(如输出到标准输出的文本)存储在t1函数的局部变量中。

因此,t1最终为空是正常的。

$()称为命令替换。)

退出代码始终分配给$?,因此您可以执行

function0()
{
  (exit 1)
  echo "$?"
}
Run Code Online (Sandbox Code Playgroud)

以获得您正在寻找的效果。您当然可以分配$?给另一个变量:

function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}
Run Code Online (Sandbox Code Playgroud)


cuo*_*glm 15

退出代码存储在$? 多变的。使用命令替换仅捕获输出,您应该使用(...) 创建 subshel​​l

#!/bin/bash

func() {
  (exit 1)
  local t1=$?
  printf '%d\n' "$t1"
}

func
Run Code Online (Sandbox Code Playgroud)


mik*_*erv 9

bash这部作品中:

loc(){  local   "x=$(exit "$1"):$?"
        printf  '$%s:\t%d\n' \
                 x "${x##*:}" \? "$?"
}
Run Code Online (Sandbox Code Playgroud)

它与命令评估和变量分配的顺序有关。local有一个自己的返回值 - 它是当前正在执行的命令,而不是命令替换。原因像...

x=$(exit 1); echo "$?"
Run Code Online (Sandbox Code Playgroud)

...可以返回 1 是因为除了子shell运行分配$x值之外,该命令中永远没有返回- 因此$?不会像在使用命令替换的几乎所有其他情况下那样受到破坏。

无论如何,local确实会被破坏 - 但如果你在正确的时间抓住它 - 即在扩展仍在评估中并且before local的例程有机会破坏它 - 你仍然可以分配它。

unset x; loc 130; echo "${x-\$x is unset}"
Run Code Online (Sandbox Code Playgroud)

...印刷...

$x: 130
$?: 0
$x is unset
Run Code Online (Sandbox Code Playgroud)

您应该知道,在许多 shell 中,您不能依赖$?以这种方式设置中间评估。事实上,这可能是因为这些 shell 不会像可能bash那样在每个可能的时刻重新评估——我认为这可能是比bash's更好的行为。你真的希望你的解释器递归循环评估很可能在你有机会使用它们之前被覆盖的值吗?

无论如何,这就是你可以做到的。