
Я обнаружил, что когда я хочу создать какой-нибудь скрипт оболочки или расширенную команду, мне всегда трудно запомнить названия команд и их переключатели.
например
tr -d '\n' < file | wc -c
Хотя на языках программирования я мог бы написать что-то вроде
len(replace(str(файл), "\n", ""))
Это более запоминаемо, и вероятность поиска в man-страницах ниже, и это более понятно для других.
Итак, почему скрипты оболочки так много лет находятся в этой скрытой форме? Это попытка изменить синтаксис, чтобы было понятно, что делает код, без изучения множества страниц руководства? Есть ли какие-то преимущества этой формы? Как мы можем справиться с недостатками, чтобы получить максимальную отдачу от скриптов оболочки?
решение1
Сколько языков программирования вы знаете, которые позволяют открыть файл для чтения, вызвать библиотечную функцию, которая использует содержимое этого файла, передать вывод этой функции в другую, вернуть вывод второй функции пользователю, вернуть статус выхода, а затем все очистить, и все это в одной очень короткой строке?
Приведенный вами пример не учитывает значительную часть поддержки, которая необходима большинству языков.
Сколько языков программирования имеют библиотечные функции, которые принимают произвольное количество входных данных, работают в различных режимах и имеют простой интерфейс?
printf
, может быть, но большинство библиотек в конечном итоге имеют целый ряд функций с разными именами и разными параметрами, которые вам нужно изучить. Я не вижу разницы.
Кроме того, большинство языков вызывают функции последовательно. Скрипты оболочки запускают их параллельно и могут передавать произвольные объемы данных по конвейеру, не потребляя много памяти, и (если источником данных является клавиатура, сетевой сокет или что-то еще) все это делается с помощью ленивой оценки, по мере поступления данных. А ваш любимый язык делает это?
Существует множество языков, которые могут выполнять эту работу быстрее, эффективнее или точнее, но не стоит недооценивать мощь скрипта оболочки!
А синтаксис? Ну, он работает. Его придется выучить, как бы он сейчас ни выглядел. Чего еще надо?
решение2
Пытатьсяpbs
-- объединение инструментов командной строки с Python -- например, так:
# sort this directory by biggest file
print sort(du(glob("*"), "-sb"), "-rn")
# print the number of folders and files in /etc
print wc(ls("/etc", "-1"), "-l")