1. 程式人生 > >linux C之basename, dirname函式

linux C之basename, dirname函式

環境(centos 6.10):

$ uname -r
2.6.32-754.el6.x86_64

函式定義:

// /usr/include/libgen.h
extern char *__xpg_basename (char *__path) __THROW;
#define basename        __xpg_basename

這個basename函式可以返回路徑最後一個路徑分隔符之後的內容,
比如basename("/usr/local/abc") 返回 abc.

呼叫示例如下:

#include <stdio.h>
#include <libgen.h>
int main(int argc, char *argv[]) { char* files[] = { "/usr/local/nginx/conf/nginx.conf", "./a.out", "/usr/include/libgen.h", NULL }; char **p = files; while (*p) { printf("basename(\"%s\")=%s\n", *p, basename(*p)); *p++; } return 0; }

編譯執行:

$ gcc basename.c
$ ./a.out
basename("/usr/local/nginx/conf/nginx.conf")=nginx.conf
basename("./a.out")=a.out
basename("/usr/include/libgen.h")=libgen.h

直觀點理解, 就是輸出“檔名”。

shell下有個命令, 也叫basename, 用法一樣, 示例:

$ for i in /usr/local/nginx/conf/nginx.conf ./a.out /usr/include/libgen.h; do basename $i; done
nginx.conf
a.out
libgen.h

還有個叫dirname的函式, 也在libgen.h中:

extern char *dirname (char *__path) __THROW;

dirname用法和basename一樣, 不過它返回的是除去"檔名"之外的目錄名. 同名的命令dirname也是同樣的功能, 一看就明白:

$ for i in /usr/local/nginx/conf/nginx.conf ./a.out /usr/include/libgen.h; do dirname $i; done
/usr/local/nginx/conf
.
/usr/include

這個dirname命令有個慣用法, 就是獲取當前指令碼所在路徑:

scriptDir=$(cd `dirname $0`; pwd)

這樣不管代在哪裡執行這個指令碼, $scriptDir的值都可以取得你執行時的目錄名. 非常實用.

歡迎補充指正!