2012-05-22 2 views
17
ifconfig | grep 'inet' 

은 터미널을 통해 실행될 때 작동합니다. 하지만 QProcess터미널에서 작업 중이지만 QProcess를 통해 작업하지 않음

를 통해

내 샘플 코드는 텍스트 편집기에 표시지고

QProcess p1; 
p1.start("ifconfig | grep 'inet'"); 
p1.waitForFinished(); 
QString output(p1.readAllStandardOutput()); 
textEdit->setText(output); 

아무것도 없다.

그러나 q 프로세스가 시작될 때 ifconfig 만 사용하면 출력이 textedit에 표시됩니다. '\'을 사용하고 |\|을 사용하는 것과 같은 명령어 ifconfig | grep 'inet'을 작성하는 트릭을 놓쳤습니까? 특수 문자? 하지만 나뿐만 아니라 :(

+0

ifconifg의 전체 경로를 지정해야합니다. 응용 프로그램마다 다른 PATH 변수가 있습니다. –

+0

@ KamilKlimek 단일 명령의 경우이 문제가있을 수 있으므로이 경우 QPSK에서 지원하지 않는 명령의 파이핑이 실제 문제입니다. – leemes

+0

오른쪽! 그 중 하나에 대해 완전히 잊어 버렸습니다 –

답변

34

QProcess 하나 개의 단일 처리를 실행한다. . 당신이 할하려는 것은 쉘 명령을 실행하지 프로세스는 명령의 배관은 쉘의 기능입니다

세 가지 가능한 솔루션이 있습니다.

가 령 어를 넣어이 ("명령") 당신이 -csh에 인수로 실행하려면 D :

QProcess sh; 
sh.start("sh", QStringList() << "-c" << "ifconfig | grep inet"); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

아니면 sh에 표준 입력으로 명령을 작성할 수

QProcess sh; 
sh.start("sh"); 

sh.write("ifconfig | grep inet"); 
sh.closeWriteChannel(); 

sh.waitForFinished(); 
QByteArray output = sh.readAll(); 
sh.close(); 

방지하는 또 다른 접근 방식을

QProcess ifconfig; 
QProcess grep; 

ifconfig.setStandardOutputProcess(&grep); // "simulates" ifconfig | grep 

ifconfig.start("ifconfig"); 
grep.start("grep", QStringList() << "inet"); // pass arguments using QStringList 

grep.waitForFinished(); // grep finishes after ifconfig does 
QByteArray output = grep.readAll(); // now the output is found in the 2nd process 
ifconfig.close(); 
grep.close(); 
+0

어떻게 되었습니까? – ScarCode

+5

몇 가지 가능한 솔루션에 대한 코드 예제를 추가했습니다. – leemes

+2

Grep이 작동했습니다.하지만 ifconfig의 출력을 awk '/inet/{gsub(/.*:/,""$1);print$1}'로 파이프하고 싶습니다. Q 프로세스를 통해서가 아니라 터미널에서 일부 o/p를 성공적으로 인쇄했습니다. 나는 당신의 해결책 2를 사용했습니다. – ScarCode

6

QProcess 개체가 자동으로 당신에게 만발한 쉘 구문을 제공하지 않는 것을 시도 : 당신은 파이프를 사용할 수 없습니다 이것에 대한 쉘을 사용합니다.

p1.start("/bin/sh -c \"ifconfig | grep inet\""); 
+1

나는 이것을 시도했다. 그러나 아직도 일하지 않는다!! – ScarCode

+1

아, 그렇습니다. 따옴표가 아닌 큰 따옴표 여야합니다. – kmkaplan

+3

대체 방법 (더 복잡하다면 인수 내에서 이스케이프에주의 할 필요가 없기 때문에 더 안전합니다.)'p1.start ("/ bin/sh", QStringList() < < "-c"<< "ifconfig | grep inet"); ' – leemes

4

당신은 페이지를 사용할 수 없습니다 sh 두 QProcesses를 실행하고 코드에서 배관을하는 것입니다 QProcess에서 ipe 기호가 보인다.

그러나 출력을 다음 프로세스로 파이프하는 방법은 setStandardOutputProcess입니다.

예제는 API에서 제공됩니다.

관련 문제