下面的示例显示了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
感谢。
答案 0 :(得分:4)
local
本身就是一个命令,而不仅仅是赋值语句的修饰符。在test1
中,您正在记录local
命令的退出状态,而不是命令替换中的命令。在test2
中,您已将local
命令与分配分隔为标记为本地的变量,因此$?
包含您期望的退出状态。
不相关,但在将变量标记为本地时不需要初始化变量。这很好用:
local temp_file
temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
在您实际为其分配值之前, temp_file
仍然未设置,但在您实际分配值时,名称是本地的。