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

问题描述 投票:0回答:1

我正在使用 Databricks Notebook 使用

%sh
执行 Shell 脚本,我想将错误消息捕获到
err
变量中,然后在
cat
命令失败时打印错误消息(例如,如果
header_file 则故意失败) 
目录不存在)。在下面的代码中,如果
cat
命令失败,它会进入
if
语句并正确打印错误代码,但不会显示来自
err
变量的错误。错误消息显示为
Error msg : 
,但未显示
cat
命令失败的原因。

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

我检查了问题是否与

cat
命令有关,并尝试使用
ls
命令进行复制。在
ls
命令中,错误消息正确显示为
Error msg : ls: cannot access '/dbfs/mnt/devl/header_file/*.csv': No such file or directory
。这是由于
cat
命令的某些限制吗?

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

注意: 我的问题与如何处理未找到的文件/文件夹无关。这个问题的目的是显示实际的错误消息,说明为什么

cat
命令因
cat
命令的任何类型的失败而失败。

bash shell sh databricks databricks-notebook
1个回答
0
投票

您可以通过更改

STDOUT
STDERR
重定向的位置来解决问题:

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

这会将

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

© www.soinside.com 2019 - 2024. All rights reserved.