通过C++程序将命令传入shell脚本。

问题描述 投票:0回答:1

我正试图通过C++程序向我的shell脚本中传递一个命令,但我对C++一点也不熟悉,虽然我知道必须使用system(),但我不知道如何有效地设置它。

#include <iostream>
#include <stdlib.h>

int main() {
        system("./script $1");

        return 0;

}

这是我目前的情况。

似乎我不能在system命令中使用位置参数,但我不知道还能做什么。 我是想通过C++程序向脚本中传递一个参数。

c++ bash shell makefile
1个回答
3
投票

如果你只是想调用".script",将C++程序的第一个参数作为脚本的第一个参数传递,你可以这样做。

#include <iostream>
#include <string>
#include <stdlib.h>

int main(int argc, char ** argv)
{  
   if (argc < 2)
   {  
      printf("Usage:  ./MyProgram the_argument\n");
      exit(10);
   }

   std::string commandLine = "./script ";
   commandLine += argv[1];

   std::cout << "Executing command: " << commandLine << std::endl;
   system(commandLine.c_str());
   return 0;
}

0
投票

从C++中正确地执行shell命令实际上需要相当多的设置, 而要了解它的具体工作原理,需要对操作系统以及它们如何处理进程进行大量的解释. 如果你想更好地理解它,我推荐你阅读man页上的 叉子()exec() 命令。

为了仅仅从一个C++程序中执行一个shell进程,你会想做这样的事情。

#include <unistd.h>
#include <iostream>

int main() {
    int pid = fork();
    if (pid == 0) {
        /*
         * A return value of 0 means this is the child process that we will use
         * to execute the shell command.
         */
        execl("/path/to/bash/binary", "bash", "args", "to", "pass", "in");
    }

    /*
     * If execution reaches this point, you're in the parent process
     * and can go about doing whatever else you wanted to do in your program.
     */
    std::cout << "QED" << std::endl;
}

为了(非常)快速地解释这里发生的事情 fork() 命令本质上是复制整个正在执行的C++程序(称为一个 处理),但数值不同的是 pidfork(). 如果 pid == 0,那么我们当前就在子进程中;否则,我们就在父进程中。因为我们在可有可无的子进程中,所以我们将子进程中的 execl() 命令,用你要执行的shell命令完全替换子进程。路径后的第一个参数需要是二进制的文件名,之后你可以将任意多的参数以空头C字符串的形式传入。

希望对大家有所帮助,如果需要进一步说明,请告诉我。


0
投票

到目前为止,我所理解的问题是,你想把参数传给c++可执行文件,然后它将进一步把这些参数传给系统脚本。

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;

// argc is the count of the arguments
// args is the array of string (basically the arguments)

int main(int argc, char ** argv) {

   // Convetion to check if arguments were provided
   // First one or two are the not positional. (these are information related to the binary that is currently being executed)
   if (argc < 2) {
      printf("Please Provide an Argument");
      return 100; // Any number other than 0 (to represent abnormal behaviour)
   }

   string scriptCommand = "./name-of-script"; // script in your case

   // Loop through and add all the arguments.
   for (int i = 1; i < argc; i++)
      scriptCommand += " " + argv[i];

   system(scriptCommand.c_str());
   return 0; // Represents a normal exit (execution).
}
© www.soinside.com 2019 - 2024. All rights reserved.