linux C之basename, dirname函式
阿新 • • 發佈:2019-01-10
環境(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的值都可以取得你執行時的目錄名. 非常實用.
歡迎補充指正!