【问题标题】:Exit status wrong with local variable assignment局部变量赋值的退出状态错误
【发布时间】:2015-10-27 23:59:49
【问题描述】:

下面的示例显示了如果将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

谢谢。

【问题讨论】:

    标签: bash


    【解决方案1】:

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


    不相关,但在将变量标记为本地时不需要对其进行初始化。这工作得很好:

    local temp_file
    temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
    

    temp_file 在您实际为其赋值之前保持未设置状态,但 name 在您实际赋值后是本地的。

    【讨论】:

    • 这是 shellcheck SC2155。 wiki 使用export,但这里同样适用。
    • 谢谢,这就解释了。
    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多