代码之家  ›  专栏  ›  技术社区  ›  nick

用exec在c++中执行shell命令

  •  1
  • nick  · 技术社区  · 6 年前

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

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

    尾部:无法打开“~/文档/测试”。用于读取的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);
    }
    

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

    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);
    }
    

    我尝试过的其他版本(未成功)有:

    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);
    

    非常感谢您的帮助!

    1 回复  |  直到 6 年前
        1
  •  4
  •   John Zwinck    6 年前

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

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

    如果不想实现此功能,只需通过 /home/yourusername 而不是 ~ 到您的程序。

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