как открыть xterm на osx из приложения c++?

Я делаю это:

popen("xterm -e ' some bash script ' ","r");

и оно отлично работает, если я запускаю свое приложение из командной строки терминала.
но если я дважды щелкну в поисковике, чтобы запустить его (т.е. не в терминале), приложение запустится, но xterm не появится.

(xterm, возможно, не является правильным решением для osx, я хочу открыть терминал из popen, взаимодействовать с пользователем внутри терминала и вернуть результат этого взаимодействия в основную программу)


person Community    schedule 13.04.2015    source источник
comment
Что это за приложение? Командная строка или какао?   -  person trojanfoe    schedule 13.04.2015
comment
это приложение X11, использующее перенасыщение.   -  person    schedule 13.04.2015


Ответы (1)


Вывод, показанный в окне xterm (или, вероятно, других терминалах), не будет прочитан popen, поэтому эта часть неясна. Однако вы говорите, что работает из окна терминала.

Другая проблема заключается в том, что переменная DISPLAY, необходимая для запуска xterm, может быть не установлена ​​в среде, в которой работает средство поиска. Вы можете обойти это, добавив подходящий параметр -display в командную строку. Например, если ваше приложение работает и отображается на локальном компьютере (вероятно), вы можете попробовать

popen("xterm -display :0.0 -e ' some bash script ' ","r");

При захвате вывода из xterm следует учитывать два типа вывода:

  • сообщения об ошибках от самого xterm записываются в стандартную ошибку
  • программа, работающая внутри xterm, например, 'some bash script', будет писать в окно xterm.

В вашем примере вы можете захватить сообщения об ошибках в канале (напрямую из popen, перенаправив стандартную ошибку в команде на стандартный вывод xterm, например,

popen("xterm -display :0.0 -e ' some bash script ' 2>&1 ","r");

Захват вывода скрипта bash сложнее. Вы можете перенаправить вывод самого скрипта bash, например,

popen("xterm -display :0.0 -e ' some bash script >mylogfile ' ","r");

но это мешает общению. Лучшим решением может быть использование программы script, которая делает что-то вроде этого:

popen("xterm -display :0.0 -e  script mylogfile ' some bash script ' ","r");
person Thomas Dickey    schedule 14.04.2015
comment
-display:0.0 ничего не меняет. И вы правы, popen не отправляет вещи обратно из xterm, я напишу временный файл, чтобы вернуть вещи. или, может быть, я могу попытаться перенаправить вывод xterm на popen &2. - person ; 14.04.2015