Когда создается файл при использовании перенаправления вывода?
У меня есть скрипт, который работает в AIX Ksh, который выглядит следующим образом:
wc dir1/* dir2/* | {awk command to rearrange output} | {grep command to filter more} > dir2/output.txt
Предварительным условием для этой строки является то, что dir2/output.txt не существует.
Проблема в том, что dir2/output.txt содержался в выходных данных (это случалось несколько сотен раз без проблем). dir1 и dir2 монтируются по NFS.
Связано ли это с реализацией wc
- что делать, если первый параметр занимает много времени? Я думаю нет, так как я попробовал следующее:
wc `sleep 5` *.txt > out.txt
Даже в этом случае out.txt не перечисляет себя.
В качестве последнего примечания в этом примере используются подстановочные знаки, которые используются в реальном скрипте. Итак, если расширение происходит первым, почему возникает эта проблема?
В какой момент создается файл dir2/output.txt?
1 ответ
Перенаправления выполняются оболочкой, как и глобусы. Ваша проблема в том, что в случае конвейера каждый этап конвейера является отдельным подпроцессом; выполняется ли подпроцесс оболочки, выполняющий окончательное перенаправление, перед тем, который создает шарик входных файлов для wc
будет зависеть от деталей планировщика и загрузки системы, между прочим, и должен считаться неопределенным.
Короче говоря, вы должны предположить, что это произойдет, и либо исключить dir2/output.txt
(Взгляни на ksh
расширенные структуры шара; в частности, что-то вроде dir2/!(output.txt)
может быть полезным) или создать выход в другом месте и mv
это к его окончательному местоположению впоследствии.