#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
打印空值。我期望:
1
为什么没有为t1
变量分配退出命令的返回值- 1
?
#!/bin/bash
function0()
{
local t1=$(exit 1)
echo $t1
}
function0
echo
打印空值。我期望:
1
为什么没有为t1
变量分配退出命令的返回值- 1
?
Answers:
local t1=$(exit 1)
告诉shell:
exit 1
在子外壳中运行;t1
函数本地的变量中。因此,正常情况t1
最终是空的。
($()
称为命令替换。)
退出代码始终分配给$?
,因此您可以执行
function0()
{
(exit 1)
echo "$?"
}
以获得想要的效果。您当然可以分配$?
给另一个变量:
function0()
{
(exit 1)
local t1=$?
echo "$t1"
}
$(trap 'printf "::ERRNO:$?"' 0; # now do whatever however
退出代码存储在$?变量。使用Command Substitution只捕获输出,您应该使用(...)创建subshell:
#!/bin/bash
func() {
(exit 1)
local t1=$?
printf '%d\n' "$t1"
}
func
t1=$?
是使用它,不是吗?不会$?
被作业op淹没吗?我想我问它是否应该printf '%d\n' "${t1}"
在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 更好的行为。您是否真的希望您的解释器递归循环评估很可能在您有机会使用它们之前被覆盖的值?
无论如何,这就是您可以做到的。
根据您尝试获取退出代码的原因,您也可以只运行if some-command; then echo "Success $?"; else echo "Failure $?"; fi
该命令,而该输出对命令的输出没有任何作用,它只是评估命令运行的退出代码。您可以添加or
(or
$(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') )
。