LINUX.ORG.RU

Qt + bash

 ,


0

1

Играюсь с bash. Интересно можно ли узнать занят ли bash, или можно вводить следующую команду.

Например:

QProcess task("bash");
task.start();
...
task.write("pkexec sudo -s\n");
task.waitForBytesWritten();
task.write("echo do THIS after sudo\n");
task.waitForBytesWritten();



В этом случае, конечно, все следующие команды после pkexec будут выполнены от рута, но вот когда они будут выполнены не могу придумать как проверить.

Пока на ум пришло только:
task.write("7z b;echo -e -n \"\\0001\"\n");
task.waitForBytesWritten();

И собственно проверять выхлоп на наличие непечатаемой хрени, но это как-то через ж...

Или все-таки лучше каждую команду выполнять по отдельности и ловить exitCode из QProcess?

★★★★

Последнее исправление: LinuxDebian (всего исправлений: 1)

Лучше по отдельности, зачем тут вообще bash… Но если сильно хочется, то можно обрабатывать вывод bash через QProcess.

rumgot ★★★★★
()
Ответ на: комментарий от rumgot

зачем тут вообще bash

Просто интересно как с ним «общаться» можно. Ну например GUI для баша сделать, как то же нужно определить когда выдать пользователю «строку приглашение» на ввод следующей команды.

LinuxDebian ★★★★
() автор топика
Последнее исправление: LinuxDebian (всего исправлений: 1)
Ответ на: комментарий от LinuxDebian

Я думаю не стоит изобретать велосипед. Хочется GUI в баше - есть zenity. Есть в почти любом десктопном дистре по умолчанию и работает на винде из msys2.

К сожалению клоны и форки zenity для Qt дохлые.

ArkaDOSik ★★
()
Ответ на: комментарий от LinuxDebian

если ты хочешь узнать когда команда закончится - просто подожди пока процесс с башем закончится, у него же есть pid. но «общаться» с башем надо безусловно через пайпы, которых у него три: stdin, stdout и stderr.

anonymous
()

Ты поехавший что ли? У тебя есть с++ у тебя есть qt, а ты дергаешь bash который убогий от и до.

anonymous
()

Или все-таки лучше каждую команду выполнять по отдельности и ловить exitCode из QProcess?

Я бы сделал именно так. Это позволит держать процесс под контролем, и если что-то пошло не так — выдать пользователю максимально человекочитаемое сообщение об ошибке.

Также если команды работают долго и что-то выводят в консоль, имеет смысл ловить сигналы readyReadStandardOutput() и readyReadStandardError() и обрабатывать выхлоп команд, опять-таки что-то показывая пользователю, чтобы он не думал, что программа повисла.

Без баша можно (и при описанной постановке вопроса нужно) обойтись.

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 2)

Пока на ум пришло только … но это как-то через ж… Это единственное решение. Разумеется, оно не всегда подходит(нужно быть уверенным в уникальности своего маркера). Или все-таки лучше каждую команду выполнять по отдельности и ловить exitCode из QProcess? И к тормозам баша добавятся тормоза от спаунов процессов и зачитывания bashrc. Но так легче и способ уневерсальный, это да.

anonymous
()

bash - это интерактивная оболочка пользователя или итерпретатор скриптов. У тебя тут ни пользователя нет, ни скриптов. Зачем bash? Разве что делать task.write("dothis;dothat;domore;\n");

legolegs ★★★★★
()
Ответ на: комментарий от cdshines

а что оно делать будет?

Вопрос у меня был в другом - что я могу с ним сделать, а тогда уже и решу куда его приткнуть. Просто ради интереса запустил баш в процессе и попытался с ним «пообщаться» через stdout/in. И не понял как узнать, что введенная пользователем команда завершилась. В эмуляторе терминала в таком случае печатается «приглашение» на ввод следующей команды.

LinuxDebian ★★★★
() автор топика
Ответ на: комментарий от legolegs

У тебя тут ни пользователя нет, ни скриптов

Откуда вы такие беретесь? Откуда вы знаете что у меня там в проекте есть и что будет?

Зачем bash?

Хм, да много для чего, ща что-то придумаю для примера: например у тебя есть иксы+твоя прога (и больше ничего), ты в ней можешь открыть в виджете доступ к эмулятору чтобы сделать:

task.write(«dothis;dothat;domore;\n»);

А можно еще и ряд кнопочек с макросам сделать.

В данным момент я с ним просто игрался.

LinuxDebian ★★★★
() автор топика
Последнее исправление: LinuxDebian (всего исправлений: 4)
Ответ на: комментарий от LinuxDebian

ты в ней можешь открыть в виджете доступ к эмулятору

В dolphin есть интеграция терминала, он туда cd пишет когда по папочкам ходишь. А если в терминале выполняется запущенная с руки команда, то cd не пишется, чтобы вывод не портить.

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.