使用Qt获取macOS默认shell时QProcess执行dscl命令返回空如何解决
问题根因
你的代码执行异常的核心原因是波浪号~的路径展开是shell的专属功能,dscl程序本身不识别~作为主目录的缩写。
- 你在终端直接执行命令时,shell会先把
~自动替换为当前用户主目录的绝对路径,再将参数传给dscl,所以执行正常。 - 你用
QProcess::start(executable, arguments)重载直接传参数时,没有经过shell层,~会作为字面量直接传给dscl,程序找不到对应路径,因此返回空结果。 - 你补充的
bash -c写法能正常运行,本质是让bash完成了~的路径展开后再执行dscl命令。
优雅解决方案
不要依赖shell的路径展开,直接用Qt内置接口获取当前用户主目录的绝对路径传入即可:
#include <QDir> #include <QProcess> // ......你的其他业务代码...... QProcess p; p.setProcessChannelMode(QProcess::MergedChannels); // 用QDir::homePath()直接获取主目录绝对路径,替代~ p.start("dscl", QStringList() << "." << "-read" << QDir::homePath() << "UserShell"); p.waitForFinished(); auto result = QString::fromUtf8(p.readAll());
内容的提问来源于stack exchange,提问作者Alexander Dyagilev
相关产品推荐
相关产品推荐

