bash - 如何在命令替换中使用检测失败

标签 bash

如您所知,set -e 对于发现执行命令时的任何故障非常有用。但是我发现它使用起来很微妙,我不知道如何在以下场景中使用它:

==============第一个例子=============================== =

set -e
function main() {    
  local X1="$(exp::notdefined)"    
  echo "Will reach here : ${LINENO}"    
  X2="$(exp::notdefined)"    
  echo "Will not reach here : ${LINENO}"
}
main 

==============第二个例子============================= =

set -e    
function exp::tmp() {    
  echo "Now '$-' is "$-" : ${LINENO}"    
  false    
  return 0
}    
function main() {    
  X1="$(exp::tmp)"    
  echo "Will reach here : ${LINENO}. '\$X1' : ${X1}"    
  X2="$(set -e ; exp::tmp)"    
  echo "Will not reach here : ${LINENO}"
}    
main

===============================

第一个示例表明,如果我们对局部变量使用命令替换,那么即使找不到替换的命令也不会失败。我不知道如何检测这类故障。

第二个示例表明,如果 bash 选项 (-e) 不会传播,除非我们在命令大括号内调用 set -e。有没有更好的方法来做到这一点?

最佳答案

您使用 -e 请求管道故障时立即退出,例如:

-e      Exit immediately if a pipeline (which may consistof a single simple
        command), a list, or a compound command (see SHELL GRAMMAR above), 
        exits with a non-zero status.

错误的命令替换 不会导致函数失败的原因是local 提供了它自己的返回状态

local [option] [name[=value] ...]
... The return status is 0 unless local is used outside a function, an invalid name is supplied, or name is a readonly variable.

失败命令替换的赋值不会导致local返回非零值。因此,不会触发立即退出。

就检查 local 之后的命令替换失败而言,由于输出已分配给变量,并且返回值不会是非零命令替换失败的事件,您将必须通过检查变量内容本身以获取成功/失败的预期值来进行验证。

关于bash - 如何在命令替换中使用检测失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913988/

相关文章:

linux - 从文件中删除以多个值之一开头的所有行的可扩展方法

linux - satement "export variable=lib:/dev/input/event0"中的运算符冒号在 linux 环境中是什么意思?

linux - 如何在启动时自动运行此脚本

bash - 如何将命令的输出除以二,并将结果存储到 bash 变量中?

bash - 将文件的第一列与 awk 匹配,引号有困难

linux - 捕获错误消息并创建日记条目

bash - 使用 Bash 进行函数式编程

linux - 临时 shell 变量存储在 shell session 中的什么位置?

git - -bash : hooks/post-receive: Permission denied

linux - 使用单引号的 Perl 行运行速度比使用双引号快 30 倍