2010-09-01 14 views

Respuesta

26

~ es conocido solo por el shell y no por la llamada al sistema mkdir.

Pero si se intenta:

system("mkdir ~/foo"); 

esto funciona como el "mkdir ~/foo" se pasa a un shell y shell expande ~ a $HOME

Si desea hacer uso de la $HOME con mkdir, puede hacer uso de la función getenv como:

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); 
} 
+10

-1 para dar código de ejemplo con un gran problema de desbordamiento de búfer. Debe editar esto para usar snprintf o verificar la longitud de 'home' antes de llamar a' sprintf'. –

5

~ se suele expandido en la cáscara. No usar el shell significa que usted es responsable de expandirlo.

12

~ es un meta-personaje de shell, no un 'acceso directo' provisto por el kernel.

Consulte las páginas del manual wordexp(3) o glob(3) si desea admitir ~ fácilmente. (Pueden hacer mucho más de lo que desee).

+0

(Gracias a o11c for th e entrada 'glob (3)'; no funciona '~', pero sigue siendo útil). – sarnold

+0

Sí lo hace, consulte 'GLOB_TILDE' (y' GLOB_TILDE_CHECK') en esa página. – o11c

Cuestiones relacionadas