Как запустить команду bash независимо от пробелов - PullRequest
0 голосов
/ 16 октября 2018

Я работаю над программой на Си, с системными командами.Я настроил его на sh -c.Это не работает с командами с пробелами.Есть ли команда для запуска команды с пробелами над оболочкой, независимо от того, есть ли у нее пробелы.В настоящее время я использую команду sh -c, например так:

char s[500];
  strcpy (s, "sh -c");
  strcat (s, i);
  system (s);

1 Ответ

0 голосов
/ 16 октября 2018

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

...