Моя порада:
bash
(і її невірно) не є мовами програмування загального призначення. Хоча можна виконати деякі складні сценарії, bash
це не найкращий спосіб навчитися програмуванню взагалі. Це найбільш природний спосіб виконання завдань системного адміністрування, які в основному обертаються навколо виконання інших програм, обробки їх файлів даних і каталогів, а також маршалінг введення та виведення в них і з них. Якщо bash
це молоток, зарезервуйте його для проблем, які справді нагадують цвяхи. Навчитися робити що-небудь нетривіальне bash
буде значно простіше, якщо ви дізнаєтесь дуже невеликі підмножини sed
та awk
(оскільки маніпуляція з рядками в bash
значній мірі натхненна синтаксисом подібних операцій на цих "маленьких" мовах).
- Для програмування загального призначення під Linux ви почуєте безліч захопливих аргументів. Два найкращих претендента - Перл і Пітон . Це обидві мови сценаріїв дуже високого рівня, які мають загальну мету, які виявляють достатню функціональність низького рівня для виконання практично будь-якої операції, доступної для будь-якого процесу простору користувача у вашій системі, а також доступні величезні колекції попередньо написаних модулів та бібліотек.
Я рекомендую вам прочитати вступний текст на C і провести деякий час запустивши strace
і ltrace
команди на кілька простих команд , утиліт , подібних ls
і 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 і виявите, що його синтаксис є інтуїтивним та приємним. Якщо так, то більше влади вам. Однак я особисто вважаю, що моє розуміння ідіосинкразії Перла занепадає дуже швидко. Основи, які я зберігаю, але я вважаю, що це боротьба, коли мені доводиться переходити до неї більше ніж кілька рядків коду.
Є багато інших мов, які ви вивчали б, Java, Lisp та Scheme, TCL, Scala тощо. Однак я б запропонував розпочати з того, який пропонує найкращий баланс між корисністю та простотою.