Доброго времени суток.
В 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, т.е. это нечто создано, но оно - не файл.
Собственно, откуда растут ноги у такого действия?