我正尝试使用以下命令从cpp程序调用系统
system("ln -s -t \"targetDir[0]\" \"baseDir[0]\"");
targetDir和baseDir都是QStringList。程序编译并运行,但是当我执行命令时,我得到错误ln:targetDir [0]是一个无效的命令。当我通过硬编码值而不是使用变量进行测试时,它可以正常工作。我只能得出结论,它不是转义字符串,而是将变量的值放入传递给ln的参数中。对于我的生活,我无法弄清楚为什么不。
任何想法?
答案 0 :(得分:4)
/bin/sh -c
进程,显然对C ++程序的变量一无所知(在运行时,变量不存在;只有位置)。
顺便说一句,由于system(3)问题,谨慎使用code injection会很危险。想象一下,targetDir[0]
包含foo; rm -rf $HOME
....
要建立符号链接,分支过程是过度的。只需调用symlink(2)系统调用(ln(1)命令将调用,如果调用为ln -s
)
Qt库为QFile类提供了QFile::link成员函数,或静态QFile::link(两者都会调用symlink(2))
从C++17开始,C ++的未来(或最近)版本将提供std::filesystem::create_symlink
function(在Linux上将调用
symlink(2))。它可能受Boost filesystem库的启发。
PS。如果编写Linux或POSIX,我建议阅读 Advanced Linux Programming (可免费下载)。但是如果你想要一个源可移植的Qt程序,那么你可以将自己限制在慷慨的Qt API中。或者采用C ++ 17并使用它的std::filesystem
。
答案 1 :(得分:1)
C ++绝不会执行字符串插值。
如果你实际上是用C ++编写的,那么你可以(考虑targetDir
是char **
或类似的东西):
std::string command = std::string("ln -s -t \"") + targetDir[0] + "\" \"" + baseDir[0] + "\"";
system(command.c_str());