GNU/Linux >> Znalost Linux >  >> Linux

Kdy použít Bash a kdy Perl/Python/Ruby?

TL;DR – použít bash pouze pro instalaci lepšího jazyka (pokud již není k dispozici), jinak ztrácíte neobnovitelný, drahocenný lidský čas. Pokud to nemůžete udělat na příkazovém řádku ručně bez chyb, neskriptujte pomocí bash/shell.

Je rok 2015, takže bych zvážil následující:

  1. režie paměti

    • Režie paměti za běhu Ruby/Pythonu ve srovnání s bashem je malá (kvůli sdíleným knihovnám), zatímco pravděpodobně stejně nelze udržovat netriviální skript bash (tj. skript s> 100 řádky) - takže využití paměti není faktor
  2. čas spuštění

    • Spouštění Ruby/Pythonu může být trochu pomalejší, ale je pravděpodobné, že nebudete spouštět spoustu plnohodnotných procesů Ruby/Python v těsné smyčce 100krát za sekundu (pokud máte takové potřeby, bash /shell je každopádně příliš mnoho a pravděpodobně budete muset přejít na C/C++)
  3. výkon

    • téměř veškeré typické drcení dat bude v Ruby/Pythonu rychlejší – nebo alespoň srovnatelné (nebo stejně potřebujete C/C++/Haskel/OCaml/cokoli)
    • skutečný výkon/úzké místo v provádění (nebo dokonce produktivitě) nebude téměř nikdy být "nedostatek používání bash/shell" (dokonce i přepínací pomlčka Ubuntu při spuštění ukazuje, jak je bash ve skutečnosti problém - a busybox je pravděpodobně jediný případ použití, protože existuje nic víc než 'bash' a 'vi' pro psaní a spouštění kódu a často neexistuje způsob, jak přidat/stáhnout nebo uložit cokoli jiného)
    • spouštění jiných procesů k provedení úlohy (jako sed/awk/grep) je ve skutečnosti mnohem pomalejší než volání metody na živém objektu v paměti
  4. produktivita

    • je příliš snadné dělat chyby v Bash/shell ve srovnání s používáním „skutečných“ metod, parametrů, proměnných a výjimek v Ruby/Pythonu
    • Agile je mainstream, zatímco Bash pro něj nemá žádnou podporu (chybí možnosti testování jednotek, knihovny, OO, modularita, linting, introspekce, protokolování, metaprogramování; téměř nemožné předělat, aniž by se něco rozbilo)
    • příliš mnoho nekompatibility s jinými shelly, drobné proměnné prostředí mohou úplně rozbít skript (a některé důležité vývojářské nástroje jako Puppet ignorují řádky shebang a předávají nebo přepisují důležité proměnné shellu), zatímco Ruby/Python mají dobře definované relativně hladké cesty migrace i pro velké změny verzí
    • naučení nového jazyka zabere zlomek času, který je třeba věnovat ladění skriptů shellu kvůli problémům specifickým pro shell (zejména - názvy proměnných, žádné booleany, žádné výjimky atd.)
    • i spouštěcí skripty jsou nášlapnou minou (zejména protože mohou během systému selhat spuštění) a vzhledem k nedávným bezpečnostním chybám s bash, možná bude pro vás lepší používat obyčejný C (s dobrými knihovnami) – ano, C potřebuje kompilaci, konfiguraci atd., ale i jednoduchý shell skript může potřebovat úložiště a poté verzování , pak stejně balení.
    • cokoli, co je k dispozici pomocí sed/awk/grep, je pravděpodobně již zabudováno do Ruby/Pythonu – aniž by to byla závislost nebo „rozdíly“ mezi verzemi těchto nástrojů napříč platformami (co když to funguje na vaši nastavení)
  5. zabezpečení práce
    • jaký má smysl zajistit si práci, kterou nemáte rádi? (pokud neradi trávíte všechny ty hodiny těžko laditelnými, ale triviálními chybami skriptů v shellu)

Zjistil jsem, že není důvod používat Bash/Shell, pokud máte nainstalovaný Ruby/Python.

A pravděpodobně instalace Ruby/Pythonu v první řadě ani nepotřebuje bash skript (s výjimkou busyboxu některé systémové nástroje závisí na přítomnosti Pythonu/Perlu).

A pokaždé, když píšete skript shellu, „cvičíte“ přesně to – místo toho, abyste se učili něco výkonnějšího/produktivnějšího.

Proč dnes lidé používají Bash? Protože je to hrozný, těžko odstranitelný zvyk. Scénář je zřídka „hotový navždy“ po prvních několika minutách – bez ohledu na to, jak silně mají lidé tendenci takto uvažovat. Spolu s omylem „je to poslední chyba v tomto skriptu“.

Závěr:bash/shell používejte pouze tehdy, když jste absolutně nuceni na (jako ~/.bashrc , busybox), protože to není téměř nikdy "správný nástroj pro práci" v dnešní době.


Vzhledem k problému, který zvládnou oba, budete chtít použít ten, který vám bude nejvíce vyhovovat. V konečném důsledku existuje mnoho malých detailů a pouze zkušenost vás naučí je vidět.

Bash je univerzální skriptovací jazyk stejně jako Python, Ruby, Perl, ale každý má jiné přednosti než ostatní. Perl vyniká v textové analýze, Python tvrdí, že je nejelegantnější z celé skupiny, Bash skripty jsou vynikající v tom, "že víš, co tím myslím" a Ruby... no, Ruby je v mnoha věcech trochu zvláštní. způsobů.

Na rozdílech mezi nimi však skutečně záleží pouze tehdy, když máte dostatek zkušeností se skriptováním. Navrhuji, abyste si vybrali jeden jazyk a posunuli jej až na jeho hranice, než přejdete na další. Ve skriptu shellu můžete udělat hodně, víc, než by většina lidí připustila. Jakýkoli jazyk je tak těžký, jak chcete. Poté, co do něj napíšete pár věcí, je pro vás každý jazyk „snadný“.

Pokud žijete v Linuxu, znalost shellu se rychle vyplatí, takže s tím možná budete chtít začít. Pokud najdete úkol, který je nemožné nebo nepraktické vyřešit v shell skriptu, použijte něco jiného.

Také mějte na paměti, že učení skriptování shellu je velmi jednoduché. Skutečná síla spočívá v jiných programech, jako je awk, sed, tr a další.


Bash používám, když se primárně zaměřuji na práci se soubory. To může zahrnovat přesouvání, kopírování a přejmenování souborů, stejně jako použití souborů jako vstupu pro jiné programy nebo ukládání výstupu jiného programu do souborů. Zřídka píšu bash kód, který skutečně zkoumá obsah souboru nebo generuje výstup pro zápis do souboru; Nechám to na ostatních programech (které mohu napsat v Perlu nebo pythonu), které spustím přes bash.

Používám Perl a python, když se primárně zaměřuji na čtení dat ze souborů, zpracování těchto dat nějakým způsobem a zápis výstupu do souborů. Pokud zjistím, že používám (v Perlu) system příkaz, back ticks nebo (v pythonu) subprocess modul příliš rozsáhle, zvažuji psaní skriptu v bash. Na druhou stranu někdy začnu přidávat do bash skriptu tolik funkcí, že nakonec dává větší smysl ho přepisovat do Perlu/pythonu, než se zabývat omezenou (srovnáním) podporou bash pro variabilní rozsah, funkce, datové struktury atd. .


Linux
  1. Antivirus na Linuxu:Měl bych jej skutečně používat a pokud ano, kdy jej potřebuji?

  2. Prozkoumání Podman RESTful API pomocí Pythonu a Bash

  3. Kdy a proč bych měl používat Apt-get Update?

  1. Kdy mám použít TCP_NODELAY a kdy TCP_CORK?

  2. Můžeme použít C kód v Pythonu?

  3. Kdy použít pthread_exit() a kdy pthread_join() v Linuxu?

  1. V Bash, kdy alias, kdy skript a kdy napsat funkci?

  2. Kdy použít Nohup?

  3. Kdy a proč používat Docker