我正在使用 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
命令的任何类型的失败而失败。
您可以通过更改
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
处理程序重定向到文件。