我正在尝试在使用Lustre文件系统的RHEL5群集上运行一大组批处理作业。大约1%的工作我得到了一个奇怪的错误:他们无法找到他们用于转向的文本文件。重现错误的脚本如下所示:
#!/usr/bin/env bash
#PBS -t 1-18792
#PBS -l mem=4gb,walltime=30:00
#PBS -l nodes=1:ppn=1
#PBS -q hep
#PBS -o output/fit/out.txt
#PBS -e output/fit/error.txt
cd $PBS_O_WORKDIR
mkdir -p output/fit
echo 'submitted from: ' $PBS_O_WORKDIR
files=($(ls ./*.txt | sort)) # <-- NOTE THIS LINE
cat batch/fits/fit-paths.txt
对于一小部分作业,错误流输出将显示:
cat: batch/fits/fit-paths.txt: No such file or directory
很奇怪,但它变得陌生。
当我将files=($(ls ./*.txt | sort))
行更改为
files=($(ls batch/fits/*.txt | sort))
作业运行没有错误!毋庸置疑,这远非令人满意:我宁愿不让我的工作依赖于黑魔法(虽然黑魔法 魔法)。
知道这里发生了什么吗?
答案 0 :(得分:0)
尝试替换
files=($(ls ./*.txt | sort))
与
files=(./*.txt)
通常情况下,shell会自动对glob结果进行排序,而且 - 与解析ls(1)输出相反,后者永远不应该在可移植的shell脚本中完成 - 正确处理特殊字符的引用。
虽然这只是一个问题,但如果您的文件中包含某些shell元字符。这里的候选人是空格,制表符,换行符和可能的回车符。