Когда создается файл при использовании перенаправления вывода?

У меня есть скрипт, который работает в 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 это к его окончательному местоположению впоследствии.

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