Bash (или другая оболочка): обернуть все команды функцией / скриптом
Изменить: Этот вопрос изначально был специфичным для Bash. Я бы все-таки предпочел решение для bash, но если есть хороший способ сделать это в другой оболочке, это было бы полезно знать!
Хорошо, описание проблемы на высшем уровне. Я хотел бы иметь возможность добавить хук для bash, так что, когда пользователь входит, например, $cat foo | sort -n | less
это перехватывается и переводится на wrapper 'cat foo | sort -n | less'
, Я видел способы запуска команд до и после каждой команды (используя прерывания DEBUG или PROMPT_COMMAND или аналогичные), но ничего о том, как перехватить каждую команду и разрешить ее обработку другим процессом. Есть ли способ сделать это?
Для объяснения того, почему я хотел бы сделать это, если у людей есть другие предложения способов приблизиться к этому:
Такие инструменты, как скрипт, позволяют записывать все, что вы делаете в терминале, в журнал (как, в некоторой степени, делает историю bash). Однако они делают это не очень хорошо - скрипт смешивает ввод с выводом в одну большую строку и путается с приложениями, такими как vi, которые занимают экран, история дает только необработанные вводимые команды, и ни одна из них не работает хорошо, если у вас есть команды, вводимые в несколько терминалов одновременно. То, что я хотел бы сделать, это захватить гораздо более богатую информацию - например, команда, время, которое она выполнила, время, которое она выполнила, состояние выхода, первые несколько строк stdin и stdout. Я также предпочел бы послать это слушающему демону, который мог бы успешно мультиплексировать несколько терминалов. Самый простой способ сделать это - передать команду другой программе, которая может выполнить оболочку для обработки команды в качестве подпроцесса, при этом получая указатели на stdin, stdout, состояние выхода и т. Д. Для этого можно написать оболочку, но вы ' Я потерял бы большую часть функциональности уже в bash, что было бы неприятно.
Мотивация для этого возникает из-за попыток разобраться в аналитическом анализе данных, таких как процедуры после факта. Имея более подробную информацию, подобную этой, можно было бы генерировать достойные отчеты о том, что произошло, объединяя несколько вызовов одной команды в одну, где первые несколько приводили ненулевые выходы, спрашивая, откуда пришли файлы, выполняя поиск всего, что касалось файла, и т. д.
2 ответа
Запустите этот скрипт:
#!/bin/bash
while read -e line
do
wrapper "$line"
done
В простейшей форме wrapper
может состоять из eval "$LINE"
, Вы упомянули о желании иметь время, так что, возможно, вместо этого есть time eval "$line"
, Вы хотели получить статус выхода, поэтому за ним должна следовать строка save=$?
, И вы хотели захватить первые несколько строк стандартного вывода, поэтому некоторые перенаправления в порядке. И так далее.
Еще: Джо Со предлагает включить обработку многострочных команд bash. В простейшей форме, если eval возвращает "синтаксическая ошибка: неожиданный конец файла", вы должны запросить другую строку ввода перед продолжением. Еще лучше, чтобы проверить правильность команд bash, запустите bash -n <<<"$line"
прежде чем сделать eval
, Если bash -n
сообщает об ошибке конца строки, а затем запрашивает дополнительные входные данные для добавления к `$line'. И так далее.
Binfmt_misc приходит на ум. Ядро Linux позволяет распознавать произвольные исполняемые форматы файлов и передавать их в пользовательское приложение.
Вы можете использовать эту возможность для регистрации вашей оболочки, но вместо обработки произвольного исполняемого файла она должна обрабатывать все исполняемые файлы.