如何在Linux中从C执行一个shell脚本?

我怎样才能从Linux中执行一个shell脚本?

这取决于你想要做什么脚本(或任何其他程序,你想运行)。

如果你只是想运行脚本system是最简单的事情,但它也做一些其他的东西,包括运行一个shell并让它运行命令(/ bin / sh下大多数* nix)。

如果你想要通过标准input来提供shell脚本或者使用它的标准输出,你可以使用popen (和pclose )来设置一个pipe道。 这也使用shell(/ bin / sh在大多数* nix下)来运行该命令。

这两个都是库函数,在底层做了很多,但是如果它们不能满足你的需要(或者你只是想实验和学习),你也可以直接使用系统调用。 这也允许你避免让shell(/ bin / sh)为你运行你的命令。

感兴趣的系统调用是forkexecvewaitpid 。 你可能需要使用execve一个库包装器(inputman 3 exec作为它们的列表)。 您可能还想使用其他等待function之一( man 2 wait他们全部)。 此外,您可能会对与vfork有关的系统调用clonevfork感兴趣。

fork复制当前程序,其中唯一的主要区别是新进程从调用fork返回0。 父进程获取新进程的进程ID(或错误)。

execve用新程序replace当前程序(保持相同的进程ID)。

waitpid被父进程用来等待特定的subprocess完成。

让fork和execve步骤分离可以让程序在创build之前为新的进程做一些设置(而不会自动搞乱)。 这些包括将标准input,输出和标准错误更改为与所使用的父进程不同的文件,更改进程的用户或组,closuressubprocess不需要的文件,更改会话或更改环境variables。

您也可能对pipedup2系统调用感兴趣。 pipe创build一个pipe道(同时具有input和输出文件描述符)。 dup2将文件描述符复制为特定的文件描述符( dup类似,但将文件描述符复制到最低可用文件描述符)。

你可以使用system

 system("/usr/local/bin/foo.sh"); 

这会在使用sh -c执行时阻塞,然后返回状态码。

如果你可以使用POSIX,你也可以使用popen() / pclose()

 #include <stdio.h> #include <stdlib.h> int main(void) { /* ls -al | grep '^d' */ FILE *pp; pp = popen("ls -al", "r"); if (pp != NULL) { while (1) { char *line; char buf[1000]; line = fgets(buf, sizeof buf, pp); if (line == NULL) break; if (line[0] == 'd') printf("%s", line); /* line includes '\n' */ } pclose(pp); } return 0; } 

一个简单的方法是…..

 #include <stdio.h> #include <stdlib.h> #define SHELLSCRIPT "\ #/bin/bash \n\ echo \"hello\" \n\ echo \"how are you\" \n\ echo \"today\" \n\ " /*Also you can write using char array without using MACRO*/ /*You can do split it with many strings finally concatenate and send to the system(concatenated_string); */ int main() { puts("Will execute sh with the following script :"); puts(SHELLSCRIPT); puts("Starting now:"); system(SHELLSCRIPT); //it will run the script inside the c code. return 0; } 

说谢谢
Yoda @ http://www.unix.com/programming/216190-putting-bash-script-c-program.html

如果你需要更好的档次控制,你也可以去fork pipe exec路线。 这将允许您的应用程序检索从shell脚本输出的数据。

我更喜欢fork + execlp作为doron提到的“更精细”的控制。 示例代码如下所示。

将你的命令存储在一个char数组参数中,并将malloc空间作为结果。

 int fd[2]; pipe(fd); if ( (childpid = fork() ) == -1){ fprintf(stderr, "FORK failed"); return 1; } else if( childpid == 0) { close(1); dup2(fd[1], 1); close(fd[0]); execlp("/bin/sh","/bin/sh","-c",parameters,NULL); } wait(NULL); read(fd[0], result, RESULT_SIZE); printf("%s\n",result);