当前位置: 首页 > 知识库问答 >
问题:

try/catch的Bash仿真没有按预期工作

赫连明诚
2023-03-14

以下switch语句具有奇怪的行为:

3)
        if [ $state -ne $last_state ]
        then
            echo "state: $state"
        fi

        stty -F $SERIAL $BAUD -echo igncr
        echo "befor cat"
        {
            cat -v $SERIAL >> $USBDRIVE/gpsData_$filecounter.txt && echo "after cat"
        } || {
            echo "catch"
            state=0
            last_state=3
            ((filecounter++))
        }           
        ;;

我认为,当cat命令在被执行时失败时,“after cat”将被写入,而||之后的部分将被执行。但是,当我查看输出时,似乎在回显“后猫”后会发生中断,因此实际状态不会改变,将再次进入。然后stty也会失败(因为串行适配器丢失)。之后,cat命令againt在开始时失败,但现在进入“catch”块。。。。

下面是相关的输出:

pi@rpi ~/serial_logger $ ./serial_logger.sh
serial adapter found: ttyUSB0
state: 1
USB-Storage found: usb0
state: 3
before cat
after cat    #here should be entered state 0
state: 3
stty: /dev/ttyUSB0: No such file or directory
before cat
cat: /dev/ttyUSB0: No such file or directory
catch
state: 0
USB-Storage found: usb0
state: 2

我做错了什么?

共有1个答案

闻人修平
2023-03-14

在您的示例中,cat成功,这就是打印“在cat之后”并且不输入“捕获组”的原因。

我认为,当猫命令失败,而正在被超越,“后猫”将被写入

这个假设是错误的,只有当< code>cat因为您使用了< code >而成功时,才会写入“after cat”

并且||之后的部分将被排除。

请注意,没有“组失败”这样的东西,它允许您使用命令组({ [...] })在Bash中实际模拟尝试/捕获行为。考虑一下这个示例,其中包含组内的多行:

{
  cmd1
  cmd2
} || { # catch block

只要<code>cmd2<code>成功,即使<code>cmd1<code>失败,程序也不会进入catch块。

但是,您可以使用<code>

cmd1 && cmd2 && cmd3 || { # catch block

这也可以写成

{ cmd1 && cmd2 && cmd3 ; } || { # catch block

你看,无论你怎么做,语法都有点笨拙。

也许这个相关的stackoverflow问题也可以帮助你。

最后但同样重要的是,应该提到两种常见的Bash错误处理机制:

> < li>

为< code>ERR信号注册一个信号处理程序会导致Bash在命令返回非零退出状态时调用一个函数:

trap error_handler ERR

function error_handler() {
  echo error
}

设置< code>errexit shell选项会导致您的程序在命令返回非零退出状态时立即终止(信号处理程序仍在执行):

set -e
 类似资料:
  • 问题内容: 我正在审查一些新代码。该程序仅具有try和finally块。由于不包含catch块,如果try块遇到异常或任何可抛出的异常,它将如何工作?它是否直接进入了finally块? 问题答案: 如果try块中的任何代码都可以引发已检查的异常,则它必须出现在方法签名的throws子句中。如果引发了未经检查的异常,则该异常会冒泡退出方法。 无论是否引发异常,都始终执行finally块。

  • 我在使用R的group_by和SUMMARY函数时遇到了一些问题,我想知道你们是否可以帮我一些忙。我有一张类似的表格: 我试图使用dplyr的group_by和SUMMARY来找到频率列的平均值。下面是我的示例代码: 我所期望的是,一个表格被吐出来,分解按单个类别分组的平均频率,如下所示: 但是,我收到的是一个按类别分组的表,每个类别接收整个表的平均值,如下所示: 有什么线索吗?我应该说我是初学者

  • 我正在编写外壳脚本,需要检查是否安装了终端应用程序。除非有更整洁的方法,否则我想使用TRY/CATCH命令来执行此操作。

  • 我正试图将一个阻塞消费者集成为Reactor铝-SR1中的助焊剂订户。我想使用一个并行调度器,并发地执行阻塞操作。 我实现了一个主类来描述我意图:

  • 我已经配置了log4j2.xml文件,application.log文件将被创建,它应该每天翻转。 但是在JVM中,applicatoin.log文件在10MB之后会翻转,如果翻转三次,第一个文件会被覆盖。也就是说我随时都application.logapplication-2020-10-16.log.zip. 为什么log4j2(v2.13)即使配置为每日,也会每10MB滚动一次文件?任何在l

  • 我有一个用例,我需要使用Kafka进行批处理。假设在1分钟内有大约100个请求,我不想立即发布每个请求,而是想将所有100个请求分批发布到topic一次。 但是使用以下配置,批处理不会发生,一旦发送消息,它就会发布到主题并同时在消费者中接收 生产者配置 消费者配置 在这里,我设置了 linger.ms = 60000,根据我的理解,如果 linger.ms 设置为某个值,那么即使发送方线程更早变得