使用 exec 在 C++ 中执行 shell 命令

nic*_*ick 3 c++ linux bash shell system-calls

我被分配用 C++ 编写一个小型 shell 程序。它应该采用与常规 bash shell 相同的命令(例如:mv、cmp 等),然后使用 fork() 和 exec() 调用该函数的 bash 版本。

我尝试了多种调用函数的方法,但我不断遇到这个问题:当文件与可执行文件位于同一目录中时,它可以工作(例如:“tail test.txt”),但是当文件是在不同的目录中它不存在(例如:“tail ~/Documents/test.txt”)并且它告诉我该文件不存在。准确的写法是:

tail:无法打开“~/Documents/test.txt”进行读取:没有这样的文件或目录

但该文件确实存在,并且相同的命令可以在常规 bash shell 中运行。

现在我真的迷失了,它应该适用于任何目录中的文件,而且我不知道我在这里做错了什么。

这是相关代码(所有命令几乎相同):

pid_t pid = fork();
if(pid > 0)
{
   wait(NULL);
}
else if(pid == 0)
{
    execl("/bin/mv","mv", arg1.c_str(), arg2.c_str(), NULL);
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用不同版本的 exec,但是我遇到了需要char *const[]as 参数的命令的问题,因为文件路径是一个变量,它不会接受它。

char *const args[] = {"/usr/bin/tail", arg1.c_str(), "-n 5", NULL}; // error here
pid_t pid = fork();
if(pid > 0)
{
    wait(NULL);
}
else if(pid == 0)
{
    execv("/usr/bin/tail", args);
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过(不成功)的其他版本是:

char *env[] = {"PATH=~/"};
execle("/usr/bin/tail", "tail", arg1.c_str(), "-n 5", NULL, env);
execlp("/usr/bin/tail", "tail", arg1.c_str(), "-n 5", NULL);
Run Code Online (Sandbox Code Playgroud)

很感谢任何形式的帮助!

Joh*_*nck 5

~是由 shell 而不是文件系统解释的特殊字符。由于您假装是一个 shell,因此~如果您希望它工作,您需要实现处理。

为了获得灵感,您可以在这里查看Python如何实现它(作为函数os.path.expanduser()): https: //github.com/python/cpython/search ?utf8=%E2%9C%93&q=%22def+expanduser%22&type=

如果您不想实现此功能,只需将其传递给您的程序/home/yourusername即可。~

最后,注意:PATH是一个环境变量,它指定在哪里查找程序,而不是一般的文件。这就是为什么它在你的试验中没有用。