场景:
想执行一个命令,如果命令成功,则不输出任何信息,如果命令失败,输出错误信息;
通常来讲,特别简单:
1 |
$cmd >/dev/null || exit $? |
就行; 但是,如果 $cmd 会通过标准错误输出一些debug信息呢?这样的话,即使命令成功也会看到一些不必要的信息,那么如何改进呢?
基本思路就是,把标准输出扔掉(可选),标准错误重定向到标准输出,然后赋值给一个变量:
1 |
x=$(no_such_cmd 2>&1); [[ $? -ne 0 ]] && echo $x |
这个没有问题;
但是,当我们试图把这个逻辑写到函数中时,似乎就不太对了,因为函数中的变量尽量local声明,而且,声明和赋值写在一起显得紧凑、美观、有修养;如下:
1 2 3 4 |
function xx() { local x=$(no_such_cmd 2>&1) [[ $? -ne 0 ]] && echo $x } |
这是,和我们预期不一样了 ; $? 已经不是no_such_cmd 的返回值了,为什么?
参看下面截图:
显然,第一个函数中 $? 其实是local语句的返回值了(local的返回值和变量被赋了什么值没有关系,参看: help local),所以,正确的姿势是,先声明变量,再使用