Ou o executável que faz a chamada system () já transformou o nome do caminho em componentes (que é o que você entende por "quebra") e usou $ IFS (geralmente espaço) para separar os componentes ou o shell script ser invocado por system () manipulará o $ IFS em si.
Exemplo do executável dividindo o caminho:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define MAX_TOKENS 100
#define COMMAND "echo "
int main() {
char path[] = "/file/system/path";
char *delims = "/";
int i = 1;
char *token;
char broken_path[sizeof(COMMAND) + sizeof(path) + 3*MAX_TOKENS];
strcpy(broken_path, COMMAND);
token = strtok(path, delims);
while(i < MAX_TOKENS) {
if (token == NULL) {
break;
}
strcat(broken_path,"'");
strcat(broken_path, token);
strcat(broken_path, "' ");
token = strtok(NULL, delims);
}
printf("%s\n", broken_path);
return system(broken_path);
}
Um exemplo do script chamado "quebrando" o caminho:
#include <stdlib.h>
#include <stdio.h>
#define MAX_TOKENS 100
#define COMMAND "./my_script.sh "
int main() {
char path[] = "/file/system/path";
char broken_path[sizeof(COMMAND) + sizeof(path) + 2];
sprintf(broken_path, "%s %s", COMMAND, path);
return system(broken_path);
}
... com ./my_script.sh contendo
#!/bin/sh
oldIFS="$IFS"
declare -a elements
IFS="/"
# break $1 into path components
elements=($1)
echo "${elements[@]}"
IFS="$oldIFS"