Мой совет:
bash
(и тому подобное) не являются языками программирования общего назначения. В то время как возможно выполнить некоторые сложные сценарии, bash
это не лучший способ изучить программирование в целом. Это наиболее естественный способ выполнения задач системного администрирования, которые в основном связаны с выполнением других программ, обработкой их файлов данных и каталогов, а также распределением входных и выходных данных в них и из них. Если bash
это молоток, зарезервируйте его для задач, которые действительно похожи на гвозди. Научиться делать что-нибудь нетривиальное в bash
будет значительно легче, если вы выучите несколько очень маленьких подмножеств sed
и awk
(поскольку манипулирование строками в bash
значительной степени основано на синтаксисе подобных операций в этих «маленьких» языках).
- Для программирования общего назначения под Linux вы услышите много страстных аргументов. Двумя лучшими претендентами являются Perl и Python . Это скриптовые языки очень высокого уровня общего назначения, которые предоставляют достаточно низкоуровневую функциональность для выполнения практически любой операции, доступной для любого пользовательского пространства процесса в вашей системе, и с огромными коллекциями предварительно написанных модулей и библиотек.
Я рекомендую вам прочитать вводный текст на языке C и потратить некоторое время на выполнение команд strace
and ltrace
для некоторых простых служебных команд, таких как ls
and mkdir
и /bin/echo
т. Д. (На самом деле, в эти дни я бы предложил ltrace -S
вместо всего strace
лишь наброски в вывод обеих команд и в ltrace
выход как дополненные в -S
опции будет чрезвычайно образовательным).
C является основным языком программирования, на котором написано ядро Linux и GNU libc. (Мелкие детали в сборе). Почти все программы в системе Linux (или другой UNIX-подобной) связаны с библиотеками C (libc). Первичные интерпретаторы Perl и Python (и большинство других языков сценариев) также написаны на C. Эти программы (ядро, общие системные библиотеки и различные интерпретаторы языков сценариев) написаны программистами на C, поскольку их дизайн и возможности находятся под сильным влиянием. их основными реализациями. Таким образом, более глубокое понимание любого из них в конечном итоге влечет за собой понимание C. Вам не нужно ничего знать о C ++ или Java, чтобы понимать программирование на этом уровне. (Каждый из них может быть интересным и необходимым по-своему, в зависимости от вашей карьеры,
Итак, если вы согласны с моими предпосылками, мы свелись к выбору между Perl и Python.
Вот где начинаются настоящие пламенные войны.
Мой совет должен сосредоточиться на Python (2.x) в первую очередь. Python имеет относительно простой и последовательный синтаксис. Вы можете изучить основы синтаксиса Python за несколько часов, и это подавляющее большинство синтаксиса, с которым вы когда-либо сталкивались. Есть только несколько функций (списки, генераторные выражения, декораторы), которые складываются в основной синтаксис. Поэтому большая часть ваших усилий по изучению Python будет посвящена изучению обширных стандартных библиотек и попыткам найти «лучший» способ их использования (и выяснению, какие именно наборы исключений стоит обработать, чтобы сделать ваши программы устойчивыми) и, самое главное, в изучении основных понятий.
Я думаю, что обширные библиотеки Python и относительно простой синтаксис имеют два явных недостатка.
Во-первых, когда вы узнаете, как работать на очень высоком уровне в Python, вам может показаться утомительной необходимость работать на более низком уровне. Где я работаю, Perl является стандартом. Я создаю прототип своей работы на Python, где я знаю, что могу заставить ее работать намного быстрее и надежнее, чем в Perl; затем я боюсь пройти через это и перенести его на Perl для моих коллег. (Я был достаточно хорош в Perl за годы до того, как я использовал Python - так что дело не в простом знакомстве).
Другим недостатком является то, что иногда трудно найти самый высокий уровень для выполнения данной задачи в Python. Например, чтобы получить веб-страницу, вы можете сначала попытаться сделать это с низкоуровневыми сокетами ... что сработает. Тем не менее, вы будете дублировать довольно много кода, который уже можете найти, в том числе в модулях urllib
и / или urllib2
. Сам факт того, что стандартные библиотеки, начиная с версии 2.7.1, включают в себя оба из них, подтверждает мою точку зрения. По возможности сопровождающие Python прозрачно расширяли старые модули и API; однако есть десятки случаев, когда Python сохраняет два или три модуля, где прозрачное расширение по какой-то причине было невозможно. ( В качестве другого примера можно посмотреть на варианты для разбора параметров командной строки: argparse
, optparse
иgetopt
, Там мало вреда для написания ваших программ с использованием getopt
(самая старая из них). Для очень простых утилит с небольшим количеством опций и жестким соглашением о вызовах (например, используемым только небольшой группой людей) нет ничего плохого в том, чтобы ходить по sys.argv
себе. Однако обычно стоит внимательно прочитать документы и перейти по ссылкам внизу модулей более старого или более низкого уровня, в которых описаны доступные функции более нового или более высокого уровня.
Мой совет основан на моем мнении, что вы хотите сосредоточиться на более глубоких концепциях и не тратить много времени и сил на синтаксические и языковые проблемы. Понимание того, когда использовать подпроцесс, а не поток или функции многопроцессорной обработки, включенные в Python, имеет относительно мало общего с языком и все, что связано со знанием программирования, независимо от языка. (В тот момент, когда вы сможете понять аргументы в отношении управляемой событиями модели Twisted по сравнению с многопоточностью и многопроцессорностью, вы, вероятно, освоите Python и будете готовы программировать на любом языке).
Встречный аргумент для Perl прост и практичен. Есть еще несколько рабочих мест, которые будут требовать, в частности, навыков работы с Perl. Perl является мощным языком и имеет чрезвычайно обширные библиотеки. (Ядро Perl, распространяемое с большинством систем Linux, охватывает меньший набор функций, чем стандартные библиотеки Python; предполагается, что вы установили значительное количество дополнительных пакетов из своего дистрибутива или через CPAN - всеобъемлющий архив Perl Сеть). (В отличие от этого, существует меньше модулей и пакетов Python, которые мне нужно извлекать отдельно ... они доступны из PyPI - индекса пакетов Python).
Таким образом, если вы изучите Perl, вы сможете быстро найти работу, особенно сисадмина, в краткосрочной перспективе. Однако синтаксис Perl ... ну ... по словам некоторых его энтузиастов ... "патологически эклектичен!" Perl может быть очень кратким, и его код заполнен пунктуацией. Те, кто любит это, будут бесконечно утверждать, что это «легко» и имеет смысл - и у них будут бесконечные возможности сделать это на форумах, которые полны путаницы в том, как именно интерпретируется данный фрагмент кода. Синтаксис и язык, используемый в документации, а также теми, кто поддерживает его на публичных форумах, детализированы до такой степени, что вы можете потратить значительные усилия на их изучение.
Теперь, пожалуйста, поймите, что этот предыдущий комментарий субъективен и предвзят. Возможно, вы попробуете Perl и найдете его синтаксис интуитивно понятным и приятным. Если это так, больше сил для вас. Тем не менее, я лично нахожу, что мое понимание идиосинкразий Perl очень быстро разрушается. Принципы, которые я сохраняю, но я считаю, что это борьба, когда мне приходится переключаться на нее более чем на несколько строк кода.
Есть много других языков, которые вы будете изучать, Java, Lisp и Scheme, TCL, Scala и так далее. Тем не менее, я бы предложил начать с того, который предлагает лучший баланс между полезностью и простотой.