如何set -e在函数中使用语义?
这在函数问题中重新打开"set -e",因为它没有被正确回答并且已被接受.
这是一个例子:
#!/bin/bash
set -exo pipefail
f() {
echo a
false
echo Should NOT get HERE
}
if f ; then
true
fi
Run Code Online (Sandbox Code Playgroud)
我想f退出false.
我的实验表明,使用subshell (f)调用在这里没有帮助:
#!/bin/bash
set -exo pipefail
f() {
echo a
false
echo Should NOT get HERE
}
g() {
( f )
}
if g ; then
true
fi
Run Code Online (Sandbox Code Playgroud)
移动f出来的if语句当然不会在这种特殊情况下的工作:
#!/bin/bash
set -exo pipefail
f() {
echo a
false
echo …Run Code Online (Sandbox Code Playgroud) 在bash手册页中,它指出:
如果管道(可能包含一个简单的命令),
括在括号中的子shell命令,或者作为括号括起来的命令列表的一部分执行的命令之一,则立即退出...
所以我假设一个函数应该被视为括号括起来的命令列表.但是,如果对函数调用应用条件,则errexit不再在函数体内持久存在,并且在返回之前执行整个命令列表.即使您在为该子shell启用了errexit的函数内显式创建子shell,也会执行命令列表中的所有命令.这是一个演示该问题的简单示例:
function a() { b ; c ; d ; e ; }
function ap() { { b ; c ; d ; e ; } ; }
function as() { ( set -e ; b ; c ; d ; e ) ; }
function b() { false ; }
function c() { false ; }
function d() { false ; }
function e() { false ; }
Run Code Online (Sandbox Code Playgroud)
( set -Eex ; a )
+ a …Run Code Online (Sandbox Code Playgroud) 我怎样才能让Powershell像旗帜一样表现得像Bash set -e?set -o errexit使Bash脚本"如果一个简单的命令以非零状态退出则立即退出".
我以为我可以通过设置来做到这一点,$ErrorActionPreference="Stop"但这似乎不起作用.假设我有一个脚本a.ps1
$ErrorActionPreference="Stop"
& cmd /c "exit 1"
echo "cmd exited `$LastExitCode=$LastExitCode and `$?=$?"
Run Code Online (Sandbox Code Playgroud)
如果我运行它
.\a. ; echo "a.ps1 exited `$LastExitCode=$LastExitCode `$?=$?"
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是它打印出来
cmd exited $LastExitCode=1 and $?=False
a.ps1 exited $LastExitCode=1 $?=True
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?!我希望a.ps1在第一行之后退出,抛出错误并设置$?为假.
有没有官方文档解释$ ErrorActionPreference?所有我发现了这个帖子上关于咖啡博客.