QNX (Neutrino 6.5.0) использует в качестве оболочки реализацию ksh с открытым исходным кодом. Многие предоставленные сценарии, в том числе сценарии запуска системы, используют такие конструкции, как
if ! test /dev/slog -ef /dev/slog; then
# do something
fi
чтобы проверить, существует ли менеджер ресурсов в файловой системе. Я искал и смог найти только очень скучные объяснения того, что -ef
проверяет, действительно ли два параметра являются одним и тем же файлом. Поскольку указанное имя файла одно и то же, кажется, что оно просто сводится к проверке существования файла.
Я проверил поведение test -a
и test -e
(оба, кажется, проверяют наличие файла любого типа в соответствии с различными документами, которые я читал), и они, кажется, также работают.
Есть ли разница в проверках между -ef
и -a
/-e
? Является ли использование -ef
какой-то попыткой защититься от состояния гонки в существовании файла?
test
, поскольку оно является частью начального сценария запуска системы. В обычном случае /dev/slog процесс может записывать на устройство запись в файл/консоль/память, и, хотя это может закончиться с другим именем файла, устройство, отображаемое в /dev, должно быть таким же, как до напишите в /dev/slog. - person tinman   schedule 12.07.2012test
) завершен, файл/устройство удален/заменен драйвером, что приводит к тому, что второй stat() получает другую информацию, что, в свою очередь, приводит к сбоюtest
. Я давно не пользовался QNX, но справочная страница slogger предполагает наличие побочных эффектов от взаимодействия с /dev/slog (например, удаление связи приводит к очистке журнала). - person jhfrontz   schedule 12.07.2012test -a
иtest -e
относительно новые. В какой-то момент они, похоже, не были частью оболочки Posix, которая использовалась QNX (см. qnx.com/developers/docs/qnx_4.25_docs/qnx4/utils/s/sh.html . Так что теперь я подозреваю, что это просто унаследованный узор. - person jhfrontz   schedule 24.07.2012