使用exec

时间:2018-01-13 09:14:30

标签: c++ linux bash shell system-calls

我已经完成了用C ++编写一个小shell程序的任务。它应该使用与常规bash shell相同的命令(例如:mv,cmp等),然后使用fork()和exec()来调用函数的bash版本。

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

  尾巴:无法打开'〜/ 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);
}

我尝试使用不同版本的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 个答案:

答案 0 :(得分:3)

~是由shell解释的特殊字符,而不是文件系统。由于您假装是shell,因此如果您希望它能够正常工作,则需要对~实施处理。

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

如果您不想实现此功能,只需将/home/yourusername代替~传递给您的计划。

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