Решено: QProcess: запуск процесса с помощью "sh -c"

Модератор: Модераторы разделов

Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Решено: QProcess: запуск процесса с помощью "sh -c"

Сообщение Hoblin »

Есть задача: запустить некоторый bash-скрипт, хранящийся в памяти, не прибегая к помощи временных файлов. Скрипт поступает в функцию в виде большой QString-строки.
Нам, видимо, нужно, чтобы выполнилось что-то вроде:

Код: Выделить всё

$ sh -c "текст_скрипта"


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

Код: Выделить всё

$ sh -c "`cat << EOF
текст скрипта
EOF`"


Всё работает, до тех пор, пока я не откладываю bash и не пытаюсь сделать то же самое на Qt:

Код: Выделить всё

QString command = "sh -c \"`cat <<EOF\n" + scriptText + "\nEOF`\"";
process->start(command);

Вот так - не работает. При этом, если я вывожу какой-нибудь отладочный
cout << command.toUtf8() << endl;
то получаю точную копию bash-кода из листинга №2 моего сообщения. Копирую, вставляю в консоль - работает.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Решено: QProcess: запуск процесса с помощью "sh -c"

Сообщение sash-kan »

какая из двух конструкций (будучи присвоена переменной command) срабатывает правильно:
"echo 1; echo 2"
"echo 1\n echo 2"
?
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Re: Решено: QProcess: запуск процесса с помощью "sh -c"

Сообщение Hoblin »

Да, правильно.

Сейчас немного поэкспериментировал и наткнулся на такую штуку:
Если в command передаётся "echo \"12\"; echo 3" - тогда работает.
Появляется пробел: "echo \"1 2\"; echo 3" - перестаёт.

Очень странно, тут же не нужно экранировать ничего, наоборот - я для этого использую "заэкранированные" кавычки
Спасибо сказали:
Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Re: Решено: QProcess: запуск процесса с помощью "sh -c"

Сообщение Hoblin »

Ага, как мне объяснили на прог.орге, имеет смысл передавать скрипт в качестве аргумента. Я так делал, но уже тогда, когда стал заморачиваться с cat'ом.
Упростил всё обратно и использовал QStringList:

Код: Выделить всё

QStringList args << "-c" << "#!/bin/sh\n\necho \"Hello, world!\"\nxterm";
process->start("sh", args);

Так работает.

Теперь с утра нужно будет проверить в боевых условиях, на большом_и_сложном_скрипте. Но сам факт того, что хоть этот простой тест заработал, очень радует :)
Спасибо сказали:
Hoblin
Модератор
Сообщения: 1442
Статус: Etersoft team
ОС: ALT Linux

Re: Решено: QProcess: запуск процесса с помощью "sh -c"

Сообщение Hoblin »

Да, всё работает. Суть изменений:
было

Код: Выделить всё

QString command = "sh -c \"`cat <<EOF\n" + scriptText + "\nEOF`\"";
process->start(command);

стало

Код: Выделить всё

QStringList args QStringList() << "-c" << scriptText;
process->start("sh", args);
Спасибо сказали: