Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在命令替换中使用detect failure_Bash - Fatal编程技术网

Bash 如何在命令替换中使用detect failure

Bash 如何在命令替换中使用detect failure,bash,Bash,正如您所知,set-e对于在执行命令时发现任何故障都非常有用。但是我发现它使用起来很微妙,我不知道如何在以下场景中使用它: ================第一个示例================================ set -e function main() { local X1="$(exp::notdefined)" echo "Will reach here : ${LINENO}" X2="$(exp::notdefined)"

正如您所知,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
================第二个示例================================

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
===============================

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。有没有更好的方法可以做到这一点?

来自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
会导致这种情况。

您使用
-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,否则 提供的名称无效,或者名称是只读变量

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


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

我确信我在几个月前看到了一个类似的问题,它引用了同一手册部分,但现在我找不到它。这两个问题都来自man bash,来自
本地
设置
内置部分。大约在第530页和第690页。我并不是说你的答案有任何错误,但我想将此标记为与前面问题的重复。如果David是对的,你可以将
local
变量声明和定义拆分为两行,以从第二条语句中获得预期的错误代码。