我正试图通过C++程序向我的shell脚本中传递一个命令,但我对C++一点也不熟悉,虽然我知道必须使用system(),但我不知道如何有效地设置它。
#include <iostream>
#include <stdlib.h>
int main() {
system("./script $1");
return 0;
}
这是我目前的情况。
似乎我不能在system命令中使用位置参数,但我不知道还能做什么。 我是想通过C++程序向脚本中传递一个参数。
如果你只是想调用".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;
}
从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++程序(称为一个 处理),但数值不同的是 pid
从 fork()
. 如果 pid == 0
,那么我们当前就在子进程中;否则,我们就在父进程中。因为我们在可有可无的子进程中,所以我们将子进程中的 execl()
命令,用你要执行的shell命令完全替换子进程。路径后的第一个参数需要是二进制的文件名,之后你可以将任意多的参数以空头C字符串的形式传入。
希望对大家有所帮助,如果需要进一步说明,请告诉我。
到目前为止,我所理解的问题是,你想把参数传给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).
}