Почему mkdir не работает с тильдой (~)? - PullRequest
9 голосов
/ 01 сентября 2010

Когда я пишу

mkdir("~/folder1" , 0777);

в Linux, он не смог создать каталог.Если я заменю ~ на расширенный домашний каталог, он будет работать нормально.В чем проблема с использованием ~?

Спасибо

Ответы [ 3 ]

27 голосов
/ 01 сентября 2010

~ известен только оболочке, а не системному вызову mkdir.

Но если вы попробуете:

system("mkdir ~/foo");

это работает, когда "mkdir ~/foo" передается в оболочку, а оболочка расширяется ~ до $HOME

Если вы хотите использовать $HOME с mkdir, вы можете использовать функцию getenv как:

char path[MAX];
char *home = getenv ("HOME");
if (home != NULL) {
        snprintf(path, sizeof(path), "%s/new_dir", home);
        // now use path in mkdir
        mkdir(path, PERM);
}
12 голосов
/ 01 сентября 2010

~ является метасимволом оболочки, а не предоставленным ядром «ярлыком».

См. Справочные страницы wordexp(3) или glob(3), если вы хотите легко поддерживать ~. (Они могут сделать гораздо больше, чем вы хотите.)

5 голосов
/ 01 сентября 2010

~ обычно расширяется оболочкой. Отказ от использования оболочки означает, что вы несете ответственность за ее расширение.

...