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

时间:2016-01-21 01:47:11

标签: 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。有没有更好的方法呢?

2 个答案:

答案 0 :(得分:4)

您请求使用-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提供了自己的返回状态

  

本地[选项] [名称[=值] ...]
  ... 返回状态0,除非在函数外部使用local,a   提供了无效的名称,或者name是只读变量。

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

至于检查local之后的命令替换失败,因为输出被分配给变量,并且在命令的情况下返回将不是非零替换失败,您必须通过检查变量内容本身来验证成功/失败的预期值。

答案 1 :(得分:1)

来自bash手册:

   Subshells spawned to execute command substitutions inherit the value of
   the -e option from the parent shell. When not in posix mode, bash
   clears the -e option in such subshells.

当bash与--posix一起运行时,示例2的行为有所不同;但是例如1我找不到任何解释为什么local会导致这种情况的文档。