Scroll to navigation

BASENAME(3) Руководство программиста Linux BASENAME(3)

ИМЯ

basename, dirname - разделяет путь на компоненты

СИНТАКСИС

#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);

ОПИСАНИЕ

Предупреждение: есть две разных функции basename() — смотрите далее.

Функция dirname() и basename() разделяют строку с путём, заканчивающуюся null, на каталог и имя файла. Обычно, dirname() возвращает строку до последнего символа '/', не включая его, а basename() возвращает часть, следующую за последним символов '/'. Конечные символы '/' не считаются частью пути.

Если path не содержит косую черту, то dirname() возвращает строку «.», а basename() возвращает копию path. Если строка path равна «/», то dirname() и basename() возвращают строку «/». Если значение path равно указателю null или указывает на пустую строку, то dirname() и basename() возвращают строку «.».

Если объединить строку, возвращаемую dirname(), «/» и строку, возвращаемую basename(), то получится первоначальный путь.

Функции dirname() и basename() могут изменить содержимое path, поэтому желательно передавать копию строки при их вызове.

Данные функции могут возвращать указатели на статически выделенную память, которая может измениться при последующих вызовах. Или же они могут возвращать указатель на часть path, поэтому строка, на которую ссылается path, не должна изменяться или освобождаться до тех пор, пока указатель, возвращаемый функцией, станет ненужным.

В следующих примерах (взяты из SUSv2) показаны строки, возвращаемые dirname() и basename() для различных путей:

путь dirname basename
/usr/lib /usr lib
/usr/ / usr
usr . usr
/ / /
. . .
.. . ..

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

Функции dirname() и basename() возвращают указатели на строки, оканчивающиеся null (не передавайте эти указатели free(3)).

АТРИБУТЫ

Описание терминов данного раздела смотрите в attributes(7).

Интерфейс Атрибут Значение
basename(), dirname() Безвредность в нитях MT-Safe

СООТВЕТСТВИЕ СТАНДАРТАМ

POSIX.1-2001, POSIX.1-2008.

ЗАМЕЧАНИЯ

Существует две различные версии basename() — версия POSIX, описанная выше, и версия GNU, которая описана далее


    #define _GNU_SOURCE         /* смотрите feature_test_macros(7) */
#include <string.h>

Версия GNU никогда не изменяет свои аргументы и возвращает пустую строку, если path оканчивается символом косой черты, а в частности, если значение равно «/». Версии GNU для dirname() не существует.

Если в исходный код включён файл <libgen.h>, то из glibc используется версия basename(), описанная в POSIX, иначе — версия GNU.

ДЕФЕКТЫ

Функции версии POSIX, реализованные в glibc, изменяют аргумент path, что приводит к ошибки сегментации при их вызове со статической строкой вида «/usr/».

До glibc 2.2.1, функция dirname() некорректно обрабатывала пути, оканчивающиеся символами '/', а также вызывало ошибку сегментирования, если указывался аргумент со значением NULL.

ПРИМЕРЫ

Следующий пример кода демонстрирует использование basename() и dirname():

char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);

СМ. ТАКЖЕ

basename(1), dirname(1)

ЗАМЕЧАНИЯ

Эта страница является частью проекта Linux man-pages версии 5.10. Описание проекта, информацию об ошибках и последнюю версию этой страницы можно найти по адресу https://www.kernel.org/doc/man-pages/.

ПЕРЕВОД

Русский перевод этой страницы руководства был сделан Artyom Kunyov <artkun@guitarplayer.ru>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitriy Ovchinnikov <dmitriyxt5@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, ITriskTI <ITriskTI@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.

9 июня 2020 г. GNU