代码之家  ›  专栏  ›  技术社区  ›  Sarath Subramanian

处理来自cat命令的错误消息

  •  0
  • Sarath Subramanian  · 技术社区  · 2 年前

    我正在使用Databricks Notebook使用 %sh 并且我想将错误消息捕获到 err 变量,然后打印错误消息,如果 cat 命令失败(例如,如果 header_file 目录不存在)。在以下代码中,如果 命令失败,它正在进入 if 语句并正确打印错误代码,但它没有显示来自的错误 犯错误 变量错误消息显示为 Error msg : 没有说明原因 命令失败。

    err=$(cat /dbfs/mnt/devl/header_file/*.csv /dbfs/mnt/devl/data_files/*.csv > /dbfs/mnt/devl/output.txt 2>&1)
    RC=$?
    if [ $RC -ne 0 ]; then
      echo "Error code : $RC"
      echo "Error msg : $err"
    fi
    

    我检查了问题是否与 命令并尝试使用进行复制 ls 命令在里面 ls 命令,它将错误消息正确显示为 Error msg : ls: cannot access '/dbfs/mnt/devl/header_file/*.csv': No such file or directory 。这是由于的某些限制吗 命令

    err=$(ls /dbfs/mnt/devl/header_file/*.csv 2>&1)
    RC=$?
    if [ $RC -ne 0 ]; then
      echo "Error code : $RC"
      echo "Error msg : $err"
    fi
    

    笔记 : 我的问题与如何处理找不到的文件/文件夹无关。这个问题的目的是显示实际的错误信息,说明原因 的任何类型的失败导致命令失败 命令

    3 回复  |  直到 2 年前
        1
  •  2
  •   KamilCuk    2 年前

    > 由shell处理,而不是由 cat 没有打印任何消息。为内部shell添加一个命令块以进行重定向。

    err=$(
        {
            cat \
                /dbfs/mnt/devl/header_file/*.csv \
                /dbfs/mnt/devl/data_files/*.csv \
                > /dbfs/mnt/devl/output.txt
        } 2>&1
    )
    RC=$?
    if ((!RC)); then
      echo "Error code : $RC"
      echo "Error msg : $err"
    fi
    
        2
  •  1
  •   Romeo Ninov    2 年前

    您可以通过更改的位置来解决问题 STDOUT STDERR 重定向:

    err=$(cat /dbfs/mnt/devl/header_file/*.csv /dbfs/mnt/devl/data_files/*.csv 2>&1 > /dbfs/mnt/devl/output.txt)
    

    这将发送 STDERR 到原件 标准输出 处理程序(在您的情况下,这是 err 变量)并重定向原始 标准输出 处理程序到文件。

        3
  •  1
  •   Mika Feiler    2 年前

    重定向顺序很棘手。就像h0tw1r3在这里说的那样: https://unix.stackexchange.com/a/298528/96266 和链接 https://www.gnu.org/software/bash/manual/html_node/Redirections.html 上面写着:

    请注意,重定向的顺序非常重要。例如,命令

    ls > dirlist 2>&1
    

    将标准输出(文件描述符1)和标准错误(文件描述符2)都指向文件目录列表,而命令

    ls 2>&1 > dirlist
    

    仅将标准输出定向到文件目录列表,因为在将标准输出重定向到目录列表之前,标准错误已成为标准输出的副本。

    你的问题与那个问题正好相反。

    $ ls a b ga
    ls: nie ma dostępu do 'a': No such file or directory
    ls: nie ma dostępu do 'b': No such file or directory
    ga:
    $ ls a b ga 2>&1 > g | wc
          2      22     108
    $ cat g
    ga: