Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

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

LIBRARY

       Standard C library (libc, -lc)

СИНТАКСИС

       #include <libgen.h>

       char *dirname(char *path);
       char *basename(char *path);

ОПИСАНИЕ

       Warning: there are two different functions basename(); see below.

       The  functions  dirname()   and  basename()   break a null-terminated pathname string into
       directory and filename components.  In the usual case, dirname()  returns  the  string  up
       to,  but not including, the final '/', and basename()  returns the component following the
       final '/'.  Trailing '/' characters are not counted as part of the pathname.

       Если 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/».

       Before  glibc  2.2.1,  the  glibc version of dirname()  did not correctly handle pathnames
       with trailing '/' characters, and generated a segfault if given a NULL argument.

ПРИМЕРЫ

       Следующий пример кода демонстрирует использование 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)

ПЕРЕВОД

       Русский    перевод    этой    страницы    руководства    был    сделан    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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы
       узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.

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