Почему mkdir не работает с тильдой (~)?

когда я пишу

mkdir("~/folder1" , 0777);

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

Спасибо


person Steveng    schedule 01.09.2010    source источник


Ответы (3)


~ известно только оболочке, а не системному вызову 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);
}
person codaddict    schedule 01.09.2010
comment
-1 за пример кода с огромной проблемой переполнения буфера. Вы должны отредактировать это, чтобы использовать snprintf или проверить длину home перед вызовом sprintf. - person R.. GitHub STOP HELPING ICE; 01.09.2010
comment
@R..GitHubSTOPHELPINGICE, или вы можете быть программистом, который знает максимально возможную длину домашнего каталога, и вы знаете, что MAX имеет как минимум такой размер или больше. Эти функции действительно для людей, которые не знают, что они делают. Вот почему их не существовало в прошлом, когда люди умели программировать. - person Deanie; 06.11.2020
comment
@Deanie: для значения переменной среды HOME не существует максимальной длины, даже если существует максимум допустимого пути. Написанный код подвержен переполнению буфера, и написание такого неправильного кода прямо противоположно знанию того, как программировать. - person R.. GitHub STOP HELPING ICE; 06.11.2020

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

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

person sarnold    schedule 01.09.2010
comment
(Спасибо o11c за запись glob(3); она не выполняет ~, но все равно полезна.) - person sarnold; 19.04.2016
comment
Да, смотрите GLOB_TILDEGLOB_TILDE_CHECK) на этой странице. - person o11c; 19.04.2016

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

person Ignacio Vazquez-Abrams    schedule 01.09.2010