2017-06-10 3 views
1

Ich versuche, die Ausgabe eines Shell-Skript in Qt zu lesen. Das Übergeben eines Arguments an das Shell-Skript funktioniert jedoch nicht, da es vollständig ignoriert wird. Was mache ich im folgenden Auszug falsch?QProcess Passing (Shell) Argumente

QProcess *process = new QProcess; 
process->start("sh", QStringList() << "-c" << "\"xdotool getactivewindow\""); 
process->waitForFinished(); 
QString output = process->readAllStandardOutput(); 
target = output.toUInt(); 

Ich habe an mehreren anderen Threads geschaut und versucht, Lösungen wie

process->start("sh", QStringList() << "-c" << "xdotool getactivewindow"); 

und

process->start("sh", QStringList() << "-c" << "xdotool" << "getactivewindow"); 

aber keiner arbeitete.

+0

Wird statt übergeben wird 'prozess-> starten ("xdotool", QStringList() << "getactivewindow"); 'Arbeit? Was ist der Befehl, wenn Sie ihn selbst in der Shell ausführen? – m7913d

+1

In der Shell führe ich xdotool getactivewindow aus. Und thx, 'process-> start (" xdotool ", QStringList() <<" getactivewindow ");' hat funktioniert! Ich vermute, der Grund ist, dass es nur einen Befehl ohne Platz gibt, um zu entkommen. Die ursprüngliche Frage bleibt also immer noch ungelöst. – Alex

Antwort

1

Ich würde erwarten, dass Ihre zweite Methode funktionieren sollte.

Getestet habe ich es mit dem folgenden Skript (test.sh):

#!/bin/bash 
echo "First arg: $1" 
echo "Second arg: $2" 

Und ich rief das Skript QProcess in folgenden Weise verwenden:

QProcess *process = new QProcess; 
process->start("./test.sh", QStringList() << "abc" << "xyz"); 
process->waitForFinished(); 
qDebug() << process->readAllStandardOutput(); 
// returns: "First arg: abc\nSecond arg: xyz\n" => OK 

process->start("sh", QStringList() << "-c" << "./test.sh abc xyz"); 
process->waitForFinished(); 
qDebug() << process->readAllStandardOutput(); 
// returns: "First arg: abc\nSecond arg: xyz\n" => OK 

process->start("sh", QStringList() << "-c" << "./test.sh" << "abc xyz"); 
process->waitForFinished(); 
qDebug() << process->readAllStandardOutput(); 
// returns: "First arg: \nSecond arg: \n" => WRONG 

Erklärung

  • process->start("sh", QStringList() << "-c" << "\"xdotool getactivewindow\""); : es ist nicht erforderlich (noch erlaubt), die Argumente selbst zu zitieren. Die documentation ist nicht so klar, aber es heißt:

Hinweis: Keine weitere Aufspaltung der Argumente durchgeführt wird.

  • process->start("sh", QStringList() << "-c" << "xdotool getactivewindow");: dies sollte

  • process->start("sh", QStringList() << "-c" << "xdotool" << "getactivewindow"); arbeiten: getactivewindow als Argument an shxdotool