Я использовал readlink -f
и readlink -e
в нескольких случаях для разрешения символьных ссылок и насколько я могу вспомнить они дают те же результаты. Страница справочника для readlink
от man readlink
говорит:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
-e, --canonicalize-existing
canonicalize by following every symlink in every component of the given name recursively, all components must exist
После чтения страницы справочника, хотя я понимаю технические различия между -f
и -e
опции, я не могу думать об определенных ситуациях, где я использовал бы любую опцию. Есть ли определенные варианты использования и обстоятельства, где можно предпочесть использовать readlink -f
кому: readlink -e
и наоборот?
В первую очередь, оба канонизируют имена файлов, который включает:
Преобразование всех относительных путей к полным путям
Преобразование всех символьных ссылок на фактический hardlinked соединяет каналом на иерархии файловой системы
Основные отличия:
-f
канонизирует путь, который может содержать несуществующую часть файловой системы только наконец, например, каталог или файл, ненулевой статус выхода иначе; с другой стороны, -e
будет только работать, только если все компоненты существуют в файловой системе, ненулевой статус выхода иначе
Любое запаздывание /
проигнорирован в -f
, -e
запаздывание обработок /
как каталог
Так, практически:
Использовать -e
то, когда Вы хотите удостовериться в любом пути, должно существовать, например, Вам нужен статус выхода, чтобы сделать дальнейшую логическую операцию, a if
-else
протестируйте точно
Использовать -f
когда Вы не хотите, чтобы путь существовал строго теперь, но Вам нужен полный путь позже, например, Вы хотите создать разрешенный файл впоследствии, когда процесс работает, или файловая система смонтирована и так далее.
Использовать -e
с запаздыванием /
проверять на запись каталога явно как -f
игнорирует запаздывание /