Databricks Notebook中cat命令错误信息捕获失败问题咨询
解决Cat命令错误信息无法捕获的问题
问题原因
你当前的命令中,重定向顺序导致错误信息被写入输出文件而非捕获到变量:
err=$(cat /dbfs/mnt/devl/header_file/*.csv /dbfs/mnt/devl/data_files/*.csv > /dbfs/mnt/devl/output.txt 2>&1)
> /dbfs/mnt/devl/output.txt先将标准输出(stdout)指向文件,随后2>&1把标准错误(stderr)重定向到当前的stdout(也就是输出文件)。最终cat的正常输出和错误信息全部写入output.txt,$(...)无法捕获到错误内容,导致err为空。
而ls命令没有标准输出重定向,2>&1直接把错误信息导向子shell的stdout,因此能被正常捕获。
解决方案
方案1:使用命令组分离输出与错误
通过命令组{ ...; }将cat的正常输出定向到文件,同时把命令组的错误信息重定向到子shell的stdout,从而捕获到err变量:
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
这个方法无需临时文件,直接通过shell语法实现输出分离。
方案2:使用临时文件存储错误信息
如果环境不支持命令组,可以用临时文件中转错误信息:
# 将错误信息写入临时文件 cat /dbfs/mnt/devl/header_file/*.csv /dbfs/mnt/devl/data_files/*.csv > /dbfs/mnt/devl/output.txt 2>/tmp/cat_error.tmp RC=$? if [ $RC -ne 0 ]; then err=$(cat /tmp/cat_error.tmp) echo "Error code : $RC" echo "Error msg : $err" # 清理临时文件 rm /tmp/cat_error.tmp fi
内容的提问来源于stack exchange,提问作者Sarath Subramanian
相关产品推荐
相关产品推荐

