使用EagleC处理.mcool文件时遇/dev/tty设备错误求助
问题:运行EagleC批量处理脚本时出现/dev/tty错误
当前目录下存在多个多分辨率.mcool文件,使用以下EagleC脚本批量处理,计划将输出(含.stderr和.log文件)保存至./../EagleC_output目录,但执行时出现/dev/tty: No such device or address错误。
执行脚本
for mcool_file in *.mcool; do OUTPUT=$(echo $mcool_file | grep -oE "[A-Z0-9]*\.hg38" | cut -d '.' -f 1) cooler ls $mcool_file | grep -E '\/[1][0]{4}$|\/[5][0]{3,4}$' \ | tr '\n' '\t' \ | parallel --colsep '\t' --link -j16 \ --eta --progress --bar --joblog $mcool_file'_parallel.log' \ predictSV --hic-5k {1} --hic-10k {2} --hic-50k {3} \ -O './../EagleC_output/'$OUTPUT -g hg38 --balance-type ICE --output-format full \ --prob-cutoff-5k 0.8 --prob-cutoff-10k 0.8 --prob-cutoff-50k 0.99999 2> $mcool_file'.stderr' # | tr -d "'" done
错误回溯
sh: /dev/tty: No such device or address 0% 0:1=0s A001C007.hg38.nodups.pairs.mcool::/resolutions/5000 A001C007.hg38.nodush: /dev/tty: No such device or address 0% 0:1=0s A001C007.hg38.nodups.pairs.mcool::/resolutions/5000 A001C007.hg38.nodush: /dev/tty: No such device or address
单个.mcool文件的cooler ls结果
执行命令:
cooler ls ./../input/A001C007.hg38.nodups.pairs.mcool
输出:
./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/200 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/500 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/1000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/2000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/5000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/10000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/20000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/50000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/100000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/250000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/500000 ./../input/A001C007.hg38.nodups.pairs.mcool::/resolutions/1000000 (EagleC)
解决方案
1. 移除parallel的终端依赖参数
错误核心是parallel的--eta、--progress、--bar参数需要访问终端输出进度,但当前运行环境(如后台执行、非交互式shell)无可用终端。移除这些参数即可解决,同时优化脚本的可靠性:
for mcool_file in *.mcool; do # 确保输出目录存在,避免写入失败 mkdir -p ./../EagleC_output # 更可靠地提取输出前缀,避免依赖grep正则的兼容性问题 OUTPUT=$(basename "$mcool_file" .mcool | cut -d '.' -f 1) cooler ls "$mcool_file" | grep -E '\/(5000|10000|50000)$' \ | tr '\n' '\t' \ | parallel --colsep '\t' --link -j16 \ --joblog "$mcool_file"_parallel.log \ predictSV --hic-5k {1} --hic-10k {2} --hic-50k {3} \ -O "./../EagleC_output/$OUTPUT" -g hg38 --balance-type ICE --output-format full \ --prob-cutoff-5k 0.8 --prob-cutoff-10k 0.8 --prob-cutoff-50k 0.99999 2> "$mcool_file".stderr done
2. 强制parallel不使用终端(如需保留进度)
如果需要保留进度显示,给parallel添加--no-tty参数,强制其不尝试访问终端设备:
for mcool_file in *.mcool; do mkdir -p ./../EagleC_output OUTPUT=$(basename "$mcool_file" .mcool | cut -d '.' -f 1) cooler ls "$mcool_file" | grep -E '\/(5000|10000|50000)$' \ | tr '\n' '\t' \ | parallel --colsep '\t' --link -j16 --no-tty \ --eta --progress --bar --joblog "$mcool_file"_parallel.log \ predictSV --hic-5k {1} --hic-10k {2} --hic-50k {3} \ -O "./../EagleC_output/$OUTPUT" -g hg38 --balance-type ICE --output-format full \ --prob-cutoff-5k 0.8 --prob-cutoff-10k 0.8 --prob-cutoff-50k 0.99999 2> "$mcool_file".stderr done
3. 排查predictSV的终端依赖
如果上述方法无效,检查predictSV是否存在未指定的交互式参数,确保所有必要参数都已明确设置,避免其尝试读取终端输入。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

