Com aspas duplas, as variáveis serão expandidas no shell de chamada. Use aspas simples:
$ cd /; bash -c 'files=* ; echo ${files} ; for file in {0..2} ; do echo ${file} ; done'
bin boot dev etc home lib lib64 lost+found mnt opt proc root run sbin srv sys tmp usr var
0
1
2
Você deve usar matrizes, mas:
Você deve realmente fork
e exec
, se você quiser chamar um comando específico com argumentos específicos:
#include <unistd.h>
#include <cstdio>
#include <sys/types.h>
#include <sys/wait.h>
int main()
{
pid_t child = fork();
if (child == -1) // fork failed
std::perror("fork");
else if (child == 0) // child
execl("/bin/bash", "bash", "-c", "files=* ; echo ${files} ; for file in {0..2} ; do echo ${file} ; done", NULL);
else // parent
wait(NULL);
}