Файл не может быть найден в небольшой части отправленных работ

Я пытаюсь запустить очень большой набор пакетных заданий в кластере RHEL5, который использует файловую систему Luster. Я получал странную ошибку примерно с 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))

Задания выполняются без ошибок! Излишне говорить, что это далеко не удовлетворительно: я бы предпочел, чтобы моя работа не зависела от черной магии (хотя черная магия лучше, чем отсутствие магии).

Есть идеи, что здесь происходит?

1 ответ

Попробуйте заменить

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

с

files=(./*.txt)

Обычно оболочка автоматически сортирует результаты глобуса и - в отличие от анализа вывода ls(1), который никогда не должен выполняться в сценариях переносимой оболочки - правильно обрабатывает цитирование специальных символов.

Хотя это проблема, только если у вас есть файлы с определенными метасимволами оболочки. Кандидатами здесь являются пробел, табуляция, перевод строки и, возможно, возврат каретки.

Другие вопросы по тегам