2

我正在尝试在使用 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))

作业运行没有错误!不用说,这远远不能令人满意:我宁愿我的工作不依赖于黑魔法(尽管黑魔法总比没有魔法好)。

知道这里发生了什么吗?

4

1 回答 1

0

尝试更换

files=($(ls ./*.txt | sort))

files=(./*.txt)

通常,shell 会自动对 glob 结果进行排序,并且——与解析 ls(1) 输出相比,在可移植的 shell 脚本中永远不应该这样做——正确处理特殊字符的引用。

虽然这只是一个问题,如果您曾经有文件中包含某些 shell 元字符。这里的候选项是空格、制表符、换行符和可能的回车符。

于 2013-09-17T08:27:00.673 回答