July 9th, 2011

glider

Рассуждения о шеллах

В контексте этого поста, под словом "шелл" будет подразумеваться программа, которая: 1) хранит набор переменных, 2) имеет средства для работы с переменными, 3) умеет вызывать программы/апплеты, передавая на им вход константы и/или переменные, 4) умеет сохранять результаты вызванных программ в переменных, 5) предоставляет язык, на котором можно программировать предыдущие пункты.

Переменные в шелле могут быть как исключительно текстовыми, так и объектными (PowerShell, Object-oriented shell for *nix). С одной стороны, текст - удобный медиум общения между программами, к тому же доступный для восприятия человеку, к тому же имеющий универсальный набор подпиливающих тулов. С другой стороны, объектная ориентация дает больше возможностей, что, в теории, может оказаться практичным.

Впрочем, пост не об этом. Наибольший интерес для меня сейчас представляет вопрос совмещения башевского удобства пунктов 1-4 (а именно: интерполяцию строк, `` ака $(), пайпы и редиректы) с высокоуровневым языком программирования для пункта 5.

С одной стороны, есть точка зрения "Everywhere my colleagues used to use bash scripts I use Python. I have never run into any issues, and have achieved more seamless integration with the operational products I maintain". Звучит хорошо, особенно из уст Гвидо, но писать двадцать строчек для рекурсивного удаления папок ".svn" вместо одной строчки "find ./ -type d -name .svn -exec rm -rf {} \;" - рука не подымается.

С другой стороны, есть гибридные шеллы вроде IPython, которые, во-первых, являются drop-in заменой для интерпретатора некоторого языка, а, во-вторых, предоставляют возможность выполнять команды баша (например, приписывая к ним слева восклицательный знак). Для айпайтона существует даже специальный режим pysh, в котором вводимые команды сразу передаются системному шеллу, без танцев с бубном вокруг восклицательного знака. Впрочем, и здесь не без проблем - например, внутри цикла баш-команду мне выполнить не удалось.

В честь этого вопрос: знаете ли вы шелл, который бы программировался на ЯВУ, но предоставлял бы возможность дословного исполнения баш-команд наряду с интерполяцией строк? В идеале это было бы нечто, что умеет по началу строки распознавать баш-код, а также парсить конструкции вида $(). Также интересует метавопрос на тему того, имеет ли смысл предыдущий вопрос.

upd. В тему поста я недавно нашел пост на stackoverflow и его обсуждение на реддите: Why are scripting languages (e.g. Perl, Python, Ruby) not suitable as shell languages? - Stack Overflow.