使用 exec 在 C++ 中执行 shell 命令
Executing shell commands in c++ with exec
我接到了用 C++ 编写 shell 小程序的任务。它应该采用与常规 bash shell 相同的命令(例如:mv、cmp 等),然后使用 fork() 和 exec() 调用 bash 版本的函数。
我已经尝试了很多调用函数的方法,但我一直 运行 解决这个问题:当文件与可执行文件位于同一目录时(例如:"tail test.txt"), 但是当文件在不同的目录中时它不存在(例如:"tail ~/Documents/test.txt")并且它告诉我该文件不存在。准确的写法是:
tail: cannot open '~/Documents/test.txt' for reading: No such file or
directory
但该文件确实存在,并且相同的命令在常规 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);
非常感谢任何帮助!
~
是由 shell 而非文件系统解释的特殊字符。因为你假装是 shell,所以如果你想让它工作,你需要实现对 ~
的处理。
为了获得灵感,您可以在此处查看 Python 如何实现它(作为函数 os.path.expanduser()
):https://github.com/python/cpython/search?utf8=%E2%9C%93&q=%22def+expanduser%22&type=
如果您不想实现它,只需将 /home/yourusername
而不是 ~
传递给您的程序。
最后,请注意:PATH
是一个环境变量,它指定在哪里可以找到 程序 ,而不是一般的文件。这就是为什么它在您的试验中没有用。
我接到了用 C++ 编写 shell 小程序的任务。它应该采用与常规 bash shell 相同的命令(例如:mv、cmp 等),然后使用 fork() 和 exec() 调用 bash 版本的函数。
我已经尝试了很多调用函数的方法,但我一直 运行 解决这个问题:当文件与可执行文件位于同一目录时(例如:"tail test.txt"), 但是当文件在不同的目录中时它不存在(例如:"tail ~/Documents/test.txt")并且它告诉我该文件不存在。准确的写法是:
tail: cannot open '~/Documents/test.txt' for reading: No such file or directory
但该文件确实存在,并且相同的命令在常规 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);
非常感谢任何帮助!
~
是由 shell 而非文件系统解释的特殊字符。因为你假装是 shell,所以如果你想让它工作,你需要实现对 ~
的处理。
为了获得灵感,您可以在此处查看 Python 如何实现它(作为函数 os.path.expanduser()
):https://github.com/python/cpython/search?utf8=%E2%9C%93&q=%22def+expanduser%22&type=
如果您不想实现它,只需将 /home/yourusername
而不是 ~
传递给您的程序。
最后,请注意:PATH
是一个环境变量,它指定在哪里可以找到 程序 ,而不是一般的文件。这就是为什么它在您的试验中没有用。