LINUX.ORG.RU

Embedded shell


0

0

Иногда при разработке не на шелле возникает необходимость беспроблемно выполнить некоторое действие, для которого идеально подходит шелл. Ф-ция system не подходит, потому что нужно иметь доступ к выводу скрипта. Например, при написании на С, нужно получить самый поздний файл из определённой директории и взять первую часть его имени до точки. Я мог бы написать так:

char *dir = "my_dir";
char buf[BUF_LEN];
buf = `ls -t $dir | head -n1 | cut -f1 -d.`;
printf("Latest chunk: %s", buf);

Т.о. одна строка заменяет как минимум 10. И время на форки для внешних команд вроде ls не сильно скажется на общем времени выполнения программы, если такие вызовы шелла делаются редко. В конце концов, В/В с диска всегда будет медленным, вне зависимости от конкретного языка. Разумеется, компилятор C ничего не знает о ``, не умеет подставлять С'шные переменные в шелловскую команду и т.п. Это как раз и надо будет реализовать. Вопрос такой - имеет ли смысл такой гибрид? По-моему, получится очень удобный инструмент.

anonymous

Только не один printf, это, обычно делаестся через пайп с shell'ом.

marsijanin ★★
()

> Вопрос такой - имеет ли смысл такой гибрид? По-моему, получится очень удобный инструмент.

Конечно имеет, заколебёшься на C писать этот код:) Тем более если этот код не предполагается вызывать сто раз в секунду. А в диск не упрётся из-за кэша этого самого диска(если, конечно, оперативы хватит). только не забудь exit status и stderr контроллировать.

А как это сделать не помню, но в инете полно примеров, не поленись в гугл заглянуть. Через пайп делается. Тока потом придётся парсить средствами C вывод комманды ls :).

А форков я тут насчитал примерно 4 и 4 execve(). Может, правда, криво посчитал :)

true_admin ★★★★★
()

выше упомянутый popen

+ man sh на предмет опции -c

dilmah ★★★★★
()

Мне одному кажется что это очень кривой костыль? Вспоминается программа на перле где для вывода текста использовались конструкции типа exec("echo some text here").

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

>Мне одному кажется что это очень кривой костыль? Вспоминается программа на перле где для вывода текста использовались конструкции типа exec("echo some text here").

Для любителей быдлокодить на С - да, костыль. Вы видите разницу между выводом текста и двойным конвейером с ls -t, head и cut? Приведите аналогичный код на С и сравните с предложенным вариантом по критерию краткости и выразительности. И подумайте, нужно ли городить велосипед с перетрахом сишных строк, если все уже давно написано и реализовано в шелл и стандартных командах.

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

FILE * f = popen("ls -t dir | head -n1 | cut -f1 -d", "r");
fgets(buf, buf_size, f);

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

Не надо ничего парсить даже если руками все конвейры создавать будешь. А минимальный рабочий пример я написал.

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

теперь доволен ?

#include <stdio.h>

int main() {
        char buf[1024];
        FILE * f = popen("ls -t dir | head -n1 | cut -f1 -d.", "r");
        if (f) {
                if (fgets(buf, 1024, f)) {
                        printf("%s", buf);
                }
                fclose(f);
        }
        return 0;
}

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

> теперь доволен ?

второе 1024 лучше заменить на sizeof(buf) :)

dilmah ★★★★★
()

похоже, будто на С ты хочешь решать задачи, которые должны решаться на sh.

Lucky ★★
()

ээмм.. (прячусь за заборчиком от помидоров) perl?!

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