system(str)
всегда вызывает sh -c "$str"
.Вот что он делает.
То, что вы здесь делаете, это sh -c "sh -c$str"
.Почему это не так, должно быть очевидно в этом контексте.
Кроме того, sh
- это не bash - во многих операционных системах это совершенно другая оболочка, такая как ash
или dash
, и дажегде он предоставляется пакетом bash
, он запускается в режиме POSIX-совместимости с различными функциями при вызове под именем sh
.
Если вы хотите вызвать bash из вашей программы на C,вообще не используйте system()
.
#include <stdio.h>
#include <sys/wait.h>
#include <unistd.h>
/* Here's our actual shell script.
* Note that it's a constant string; this is CRITICAL for security.
* Do not UNDER ANY CIRCUMSTANCES concatenate untrusted data with this string; instead,
* use placeholders ($1, $2, etc) to pull in other data.
*/
const char* bash_script = "printf '%s\n' \"First argument: $1\" \"Second argument: $2\"";
int main(void) {
int pid = fork(); /* if we didn't fork, execlp() would end our program */
if (pid == 0) { /* if we're the child process fork() created... */
execlp("bash", /* command to invoke; in exec*p, found in PATH */
"bash", "-c", bash_script, /* actually running bash with our script */
"bash", /* $0 for the script is "bash"; "_" also common */
"Argument One", /* $1 for the script */
"Argument Two", /* $2 for the script */
NULL /* NUL terminator for argument list */
);
} else {
int exit=0;
waitpid(pid, &exit, 0);
printf("Shell exited with status: %d\n", exit);
}
}
Вы можете видеть, что это работает на https://ideone.com/UXxH02