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


Answers:


58

local t1=$(exit 1) 告诉shell:

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

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

$()称为命令替换。)

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

function0()
{
  (exit 1)
  echo "$?"
}

以获得想要的效果。您当然可以分配$?给另一个变量:

function0()
{
  (exit 1)
  local t1=$?
  echo "$t1"
}

1
您知道,也可以随时将退货放入管道中。`$(陷阱“的printf‘:: ERRNO:$?’” 0;#现在做任何然而-这个陷阱将确保写入的最后一个字符串是整个替代背景下最后的回报。
mikeserv

1
@mikeserv您是否想念背景音乐?$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
Doktor J

12

退出代码存储在$?变量。使用Command Substitution只捕获输出,您应该使用(...)创建subshel​​l

#!/bin/bash

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

func

分配的重点t1=$?是使用它,不是吗?不会$?被作业op淹没吗?我想我问它是否应该printf '%d\n' "${t1}"
Dani_l 2015年

@Dani_l:谢谢,这是一个错字。更新。
cuonglm 2015年

请注意,除非以不同的方式重定向,否则“命令替换”仅捕获标准输出。
菲特(Phatt)

7

bash这个作品中:

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

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

x=$(exit 1); echo "$?"

...可以返回1的原因是,该命令除了子shell运行以分配$x的值外,再也没有返回-因此$?不会像在其他所有使用命令替换的情况下那样被破坏。

无论如何,local的确会遭到破坏-但是,如果您在正确的时间抓住它-那时仍在评估扩展,并且 local s的例程有机会破坏它之前-您仍然可以分配它。

unset x; loc 130; echo "${x-\$x is unset}"

...印刷品...

$x: 130
$?: 0
$x is unset

您应该知道,尽管在许多shell中,您都不能依靠$?以这种方式设置中间评估。实际上,这可能是因为这些shell不会像在每个可能的连接点那样烦琐地重新评估bash-我认为这可能是比bash's 更好的行为。您是否真的希望您的解释器递归循环评估很可能在您有机会使用它们之前被覆盖的值?

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


-1

根据您尝试获取退出代码的原因,您也可以只运行if some-command; then echo "Success $?"; else echo "Failure $?"; fi该命令,而该输出对命令的输出没有任何作用,它只是评估命令运行的退出代码。您可以添加oror$(around the command and you'll still get the same results. A better example might be如果grep -q'somestring'somefile;然后回显“找到的somestring退出代码是$?”;否则“未找到somestring退出代码是$?”; fi`。

您还可以测试函数的返回码,该返回码可以是return 3最后一个命令的结果,可以是显式的或隐式的返回码,在这种情况下,您需要注意不要echo在最后加上一个功能,否则将屏蔽/重置先前的退出代码。

command_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
}
command_last; echo $?
# Outputs:
# True is 0
# False is 1
# 1

echo_last () {
  echo "True is `true`"
  echo "False is `false`"
  false
  # echo'ing literally anything (or nothing) returns true aka exit 0
  echo
}
echo_last; echo $?
# Outputs:
# True is 0
# False is 1
#            # Blank line due to empty echo
# 0

最后使坏,因为你不能这样做VAR=(SOME_COMMAND),因为VAR=()是一个数组的定义,所以你需要VAR=( $(echo 'Some value') )


所有声明的输出都是错误的,因为命令替换并没有给出退出代码,这是问题的全部重点。目前尚不清楚“肮脏的把戏”与任何事情有什么关系。
尼克·马特奥
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.