Я сделаю это:
popen("xterm -e ' some bash script ' ","r");
и это работает нормально, если я запускаю свое приложение из командной строки терминала.
но если я дважды щелкну в поисковике, чтобы запустить его (т.е. не в терминале), приложение запустится, но xterm не появится.
(xterm, возможно, не является правильным решением для osx, я хочу открыть терминал из popen, взаимодействовать с пользователем внутри терминала и вернуть результат этого взаимодействия в основную программу)
Вывод, показанный в окне xterm (или, вероятно, других терминалах), не будет прочитан popen
, так что эта часть неясна. Тем не менее, вы говорите, что работает из окна терминала.
Другая проблема заключается в том, что DISPLAY
переменная, необходимая для запуска xterm, не может быть установлена в среде, в которой работает finder. Вы можете обойти тот добавив подходящий -display
вариант в командной строке. Например, если ваше приложение работает и отображается на локальном компьютере (скорее всего), вы можете попробовать
popen("xterm -display :0.0 -e ' some bash script ' ","r");
При получении выходных данных из 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");