局部变量赋值的退出状态错误

时间:2015-10-27 15:51:27

标签: bash

下面的示例显示了temp_file如果local作为mktemp被调用的同一行的一部分,那么使用$?检索的退出状态始终为零,无论命令成功还是失败(使用mktemp_xyz以使其始终失败)。如果temp_file提前local,那么$?退出状态就是预期的。

有人能解释一下这里发生了什么吗?

#!/bin/bash

test_1()
{
    local temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
    local make_temp_file_ret_val=$?

    echo "temp_file: $temp_file"
    echo "make_temp_file_ret_val: $make_temp_file_ret_val"
}

test_2()
{
    local temp_file=""
    temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
    local make_temp_file_ret_val=$?

    echo "temp_file: $temp_file"
    echo "make_temp_file_ret_val: $make_temp_file_ret_val"
}

test_1
echo ""
test_2

输出是:

$ ./test 
./test: line 6: mktemp_xyz: command not found
temp_file: 
make_temp_file_ret_val: 0

./test: line 16: mktemp_xyz: command not found
temp_file: 
make_temp_file_ret_val: 127

感谢。

1 个答案:

答案 0 :(得分:4)

local本身就是一个命令,而不仅仅是赋值语句的修饰符。在test1中,您正在记录local命令的退出状态,而不是命令替换中的命令。在test2中,您已将local命令与分配分隔为标记为本地的变量,因此$?包含您期望的退出状态。

不相关,但在将变量标记为本地时不需要初始化变量。这很好用:

local temp_file
temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
在您实际为其分配值之前,

temp_file仍然未设置,但在您实际分配值时,名称是本地的。