相关疑难解决方法(0)

函数中的"set -e"

如何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.

我的实验表明,使用subshel​​l (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 set sh

13
推荐指数
0
解决办法
5320
查看次数

为什么bash errexit在函数调用中的表现不如预期?

在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)

bash

9
推荐指数
2
解决办法
5700
查看次数

Powershell类似于Bash的`set -e`

我怎样才能让Powershell像旗帜一样表现得像Bash set -eset -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?所有我发现了这个帖子上关于咖啡博客.

.net bash powershell

8
推荐指数
1
解决办法
1368
查看次数

标签 统计

bash ×3

.net ×1

powershell ×1

set ×1

sh ×1

shell ×1