【问题标题】:Program not outputting when backticks are used使用反引号时程序不输出
【发布时间】:2014-10-16 14:10:32
【问题描述】:

我希望将detectUpdateHomeML 的输出作为命令行参数传递到名为insertElement 的程序中。

当我尝试使用命令时

./insertElement  `./detectUpdateHomeML`

程序detectUpdateHomeML 不再输出到控制台,insertElement 也不向 XML 文件插入任何内容。

当我用测试输出程序替换 detectUpdateHomeML 时,它一切都按预期工作,输出程序输出,insertElement 将输出的信息插入 XML。

为什么它不适用于detectUpdateHomeML

detectUpdateHomeML 输出:

            std::cout << eventCount << " " << cascadeName << " " << timeFound();

            std::cout << std::flush;

int timeFound() {
  time_t rawtime;
  struct tm * timeinfo;
  char buffer [80];
  time (&rawtime);
  timeinfo = localtime (&rawtime);
  strftime (buffer,80," %Y-%m-%dT%H:%M:%S",timeinfo);
  puts (buffer);
  eventCount++;
}

插入元素代码

   #include "tinyxml2.h"
#include <iostream>

using namespace tinyxml2;

int main( int argc, const char* argv[] ) {

    XMLDocument doc;
    doc.LoadFile("homeML.xml");// Gets the root <homeML> element
    XMLElement *pRoot = doc.FirstChildElement("homeML");



/********************************************************************************************************************************************************************************
* Adds new startTimeStamp to <realTimeInformation> -> <startTimeStamp>.
* 
* TODO - data value is hard coded - it needs to enter the first time stamp recorded of that instance of object recognition.
*
********************************************************************************************************************************************************************************/
    XMLElement *pStartTimeStamp = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("realTimeInformation");
    XMLElement *pRealtimeStore = nullptr;
    XMLElement *pIter0 = pStartTimeStamp->FirstChildElement("runID");
    while (pIter0 != nullptr) {
        pRealtimeStore = pIter0;
        pIter0 = pIter0->NextSiblingElement("startTimeStamp");
    }

    if (pRealtimeStore != nullptr) {
        XMLElement *pNewStartTimeStamp = doc.NewElement("startTimeStamp");
        pNewStartTimeStamp->SetText("pNewTimeStamp");
        pStartTimeStamp->InsertAfterChild(pRealtimeStore, pNewStartTimeStamp);

    }

/********************************************************************************************************************************************************************************
* Adds new mEventID to <event> -> <mEventID>
* 
* It takes in the first argument pass to the program. 
*
********************************************************************************************************************************************************************************/
    XMLElement *pmEventID = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("event");
    XMLElement *pmEventIDStore = nullptr;
    XMLElement *pIter2 = pmEventID->FirstChildElement("mEventID");
    while (pIter2 != nullptr) {
        pmEventIDStore = pIter2;
        pIter2 = pIter2->NextSiblingElement("mEventID");
    }
    if (pmEventIDStore != nullptr) {
        XMLElement *pNewmEventID = doc.NewElement("mEventID");
        pNewmEventID->SetText(argv[1]);
        pmEventID->InsertAfterChild(pmEventIDStore, pNewmEventID);
    }

/********************************************************************************************************************************************************************************
* Adds new timeStamp to <event> -> <timeStamp>.
* 
* It takes in the third argument passed to the program.
*
********************************************************************************************************************************************************************************/
    XMLElement *pEvent = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("event");// Gets the <event> element
    XMLElement *pPrecedent = nullptr;// This is to store the element after which will insert the new element <timeStamp>
    XMLElement *pIter = pEvent->FirstChildElement("mEventID");// Gets the first location immediately before where a <timeStamp> element should be placed
    while (pIter != nullptr) {// Loops through the children of <event> and finds the last <timeStamp> element
        pPrecedent = pIter;// Store pIter as the best known location for the new <timeStamp> element
        pIter = pIter->NextSiblingElement("timeStamp");// Attempt to find the next <timeStamp> element
    }
    if (pPrecedent != nullptr) {
        XMLElement *pNewTimeStamp = doc.NewElement("timeStamp");// Create a new <timeStamp> element
        pNewTimeStamp->SetText(argv[3]);
        pEvent->InsertAfterChild(pPrecedent, pNewTimeStamp);// Insert the new element into the document
    }

/********************************************************************************************************************************************************************************
* Adds new data to <event> -> <data>.
* 
* It takes in the second argument passed to the program.
*
********************************************************************************************************************************************************************************/
    XMLElement *pEventData = pRoot->FirstChildElement("mobileDevice")->FirstChildElement("event");
    XMLElement *pEventDataStore = nullptr;
    XMLElement *pIter1 = pEventData->FirstChildElement("timeStamp");
    while (pIter1 != nullptr) {
        pEventDataStore = pIter1;
        pIter1 = pIter1->NextSiblingElement("data");
    }

    if (pEventDataStore != nullptr) {
        XMLElement *pNewDataEvent = doc.NewElement("data");
        pNewDataEvent->SetText(argv[2]);
        pEventData->InsertAfterChild(pEventDataStore, pNewDataEvent);

    }






    doc.SaveFile("homeML.xml");
}

TestInput.cpp

#include <iostream>
int main()
{using namespace std;
    std::cout << "Hello World!" << " ";
    std:cout << "after space";
    return 0;
}

【问题讨论】:

  • 尝试使用// 而不是/
  • 你的意思是.//detectUpdateHomeML
  • insertElement 期望如何接收要存储的数据?
  • 作为命令行参数
  • 如果你自己运行detectUpdateHomeML,输出是什么?

标签: c++ linux shell output backticks


【解决方案1】:

当您在反引号中运行程序时,shell 会捕获其标准输出并在命令行中替换它。所以,你实际上是在执行

./insertElement {... whatever the output of ./detectUpdateHomeML is ...}

由于输出被捕获,它自然不会显示。尝试运行

OUTPUT=`./detectUpdateHomeML`
echo "output is: $OUTPUT"
./insertElement $OUTPUT

(或只是set -x)看看实际发生了什么。


哦,这似乎只是一个 shell 问题 - 输出本身会比这里的 C++ 代码更有帮助。

【讨论】:

  • 哪个命令? ./detectUpdateHomeML 的输出作为参数(或多个参数,如另一个答案中指出的,如果输出中有空格)传递给./insertElement。我不知道这些程序中的任何一个是做什么的,输出是什么样的,输入应该是什么样的,等等。我只是告诉你你做了什么,以及为什么代码 sn-p 没有帮助我。
  • 对不起,我以为你在哪里要求我提供你答案中最后一行的 shell 输出。
【解决方案2】:

我认为问题在于 insertElement 只处理它的第二个参数,因此您需要将 ./detectUpdateHomeML 封装到引号中:

./insertElement "" "`./detectUpdateHomeML`"

甚至更好:

./insertElement "" "$( ./detectUpdateHomeML )"

【讨论】:

  • insertElement 仍然没有使用这两种方法更新 XML 文件。
  • 能否提供insertElement的源码?
  • 好的,所以对 insertElement 的调用应该如下所示:./insertElement &lt;eventID&gt; &lt;eventData&gt; &lt;timeStamp&gt; 现在让我们检查./detectUpdateHomeML 的输出
  • 输出为0 haarcascade_frontalface_alt.xml 2014-10-16T15:41:20
  • 可怕的故事.. 必须工作。您能否提供测试数据,您在问题中提到,使其工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2011-11-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多