下面的例子展示了如果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
Thanks.
local
是一个命令本身,而不仅仅是赋值语句的修饰符。在test1
,您正在记录的退出状态local
命令,不是命令替换中的命令。在test2
,你已经分开了local
命令从赋值给标记为本地的变量,所以$?
包含您期望的退出状态。
不相关,但在将变量标记为本地时不需要初始化该变量。这工作得很好:
local temp_file
temp_file=$(mktemp_xyz -q -t "test.tmp.XXXXXX")
temp_file
保持未设置状态,直到您实际为其赋值,但是name一旦你实际分配了一个值,它就是本地的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)