связывание оболочки unix - PullRequest
0 голосов
/ 07 июля 2011

Если у меня есть цикл do, который выглядит примерно как

for file in *txt; do {something on $file that results in another file ending with txt being created}; done

Будет ли это вызывать бесконечный цикл?Я довольно боюсь проверить это.

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Расширение *.txt обычно выполняется оболочкой перед выполнением любых команд. Так что нет, это не приведет к бесконечному циклу.

Я говорю "обычно", поскольку это зависит, конечно, от используемой вами оболочки. Но каждая оболочка, с которой у меня был опыт, работает таким образом, включая bash, как показано ниже:

pax$ rm -rf *.xyzzy ; touch 1.xyzzy 2.xyzzy ; ls *.xyzzy
1.xyzzy  2.xyzzy

pax$ echo ===== ; for i in *.xyzzy ; do
>    echo Processing $i
>    echo ..... before touch ; ls *.xyzzy
>    touch 3.xyzzy
>    echo ..... after touch ; ls *.xyzzy
>    echo =====
> done
=====
Processing 1.xyzzy
..... before touch
1.xyzzy  2.xyzzy
..... after touch
1.xyzzy  2.xyzzy  3.xyzzy
=====
Processing 2.xyzzy
..... before touch
1.xyzzy  2.xyzzy  3.xyzzy
..... after touch
1.xyzzy  2.xyzzy  3.xyzzy
=====

pax$ ls *.xyzzy
1.xyzzy  2.xyzzy  3.xyzzy

Вы заметите, что файл 3, добавленный во время первой итерации цикла , не влияет на цикл вообще, потому что расширение уже было выполнено в этой точке.

0 голосов
/ 07 июля 2011

Бесконечный цикл не создается, потому что расширение glob выполняется до обработки содержимого цикла.

Если вы когда-нибудь захотите попробовать что-то подобное, проверьте ulimits и настройте консервативный буфер времени ЦП и процессов для тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...