LINUX.ORG.RU

Не работает [ -f ] без sleep'а

 ,


0

1

Доброго времени суток.
В shell-скрипте понадобилось проверить существует ли файл (создать, если нет), является ли файлом, есть ли право записи. Пишу так:

touch "$1" &>/dev/null || echo "\"${1}\": not allowed to write" >&2
[ -f "$1" ] && output="$1" || echo "\"${1}\" is not a regular file" >&2
В bash всё работает, а вот в sh, если файла не существовало, то он touch'ем создастся, конечно, но вот [ -f «$1» ] вернёт 1. Если же между touch и test -f поставить sleep 0, то всё в порядке. Получается, времени вызова слипа хватает на то, чтобы файл... вот и весь вопрос - что с файлом делается такого(причем, это ведь не обновление даты изменения, работа touch закончилась же), что он не является файлом? Хотя, если заменить -f на -e, то вернётся 0, т.е. это нечто создано, но оно - не файл.
Собственно, откуда растут ноги у такого действия?

touch «$1» &>/dev/null

ты запускаешь отдельный поток же.

madcore ★★★★★
()

&>/dev/null

Мне кажется, что sh неправильно парсит эту конструкцию. bash её понимает как перенаправление stdout и stderr в /dev/null, а sh отдельно распознаёт & и >/dev/null, запуская процесс touch в фоновом режиме из-за &.

Попробуйте убрать &>/dev/null совсем. Если поможет, то попробуйте заменить это на «> /dev/null 2>&1» для достижения исходного эффекта.

gentoo_root ★★★★★
()
Ответ на: комментарий от gentoo_root

Спасибо, действительно помогло.
Т.е. получается, что вышеописанное равноценно примерно следующему?

touch "$1" & [ -f "$1" ]

BeHappy
() автор топика
Ответ на: комментарий от BeHappy
touch "$1" & 
[ -f "$1" ]

& относится только к той команде, за которой следует и отправляет ее в фоновый режим, т.е. не дожидаясь завершения отдает начинает выполнять следующую

marvin_yorke ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.