GNU/Linux >> Znalost Linux >  >> Linux

One-liner vs Script?

Všiml jsem si spousty otázek, odpovědí a komentářů vyjadřujících pohrdání (a někdy dokonce strach z) psaní scénářů namísto jednoduchých textů. Takže bych rád věděl:

  • Kdy a proč bych měl napsat samostatný scénář spíše než „jednořádkový“? Nebo naopak?

  • Jaké jsou případy použití a klady a zápory obou?

  • Jsou některé jazyky (např. awk nebo perl) vhodnější pro jednolinky než jiné (např. python)? Pokud ano, proč?

  • Je to jen otázka osobních preferencí nebo existují dobré (tj. objektivní) důvody, proč za určitých okolností napsat jedno nebo druhé? Jaké jsou tyto důvody?

Definice

  • one-liner :libovolná sekvence příkazů napsaných nebo vložených přímo do příkazového řádku prostředí . Často zahrnuje kanály a/nebo použití jazyků, jako je sed , awk , perl a/nebo nástroje jako grep nebo cut nebo sort .

    Definující charakteristikou je přímé provádění na příkazovém řádku – délka a formátování jsou irelevantní. „Jedna řádka“ může být celá na jednom řádku, nebo může mít více řádků (např. sh for loop nebo vložený kód awk nebo sed s odřádkováním a odsazením pro zlepšení čitelnosti).

  • script :jakákoli posloupnost příkazů v libovolném interpretovaném jazyce (jazycích), které jsou uloženy do souboru a poté provedeny. Skript může být napsán celý v jednom jazyce, nebo to může být obal skriptu shellu kolem několika „jednořádků“ pomocí jiných jazyků.

Mám vlastní odpověď (kterou zveřejním později), ale chci, aby se to stalo kanonickou otázkou a odpovědí na toto téma, nikoli pouze mým osobním názorem.

Přijatá odpověď:

Další odpověď založená na praktických zkušenostech.

Použil bych jednořádkový kód, pokud by to byl kód „zahodit“, který bych mohl napsat přímo na výzvu. Například bych mohl použít toto:

for h in host1 host2 host3; do printf "%s\t%s\n" "$h" "$(ssh "$h" uptime)"; done

Použil bych skript, pokud bych se rozhodl, že kód stojí za záchranu. V tomto okamžiku bych přidal popis na začátek souboru, pravděpodobně přidal nějakou kontrolu chyb a možná bych to dokonce zkontroloval do úložiště kódu pro verzování. Pokud se například rozhodnu, že kontrola doby provozuschopnosti sady serverů je užitečná funkce, kterou bych používal znovu a znovu, výše uvedený jednoduchý řádek by se mohl rozšířit na toto:

#!/bin/bash
# Check the uptime for each of the known set of hosts
########################################################################
#
hosts=(host1 host2 host3)

for h in "${hosts[@]}"
do
    printf "%s\t" "$h"
    uptime=$(ssh -o ConnectTimeout=5 -n "$h" uptime 2>/dev/null)
    printf "%s\n" "${uptime:-(unreachable)}"
done

Dalo by se říci zobecnění

  • Jednovrstvá

    • Jednoduchý kód (tj. jen „několik“ příkazů) napsaný pro konkrétní jednorázový účel
    • Kód, který lze napsat rychle a snadno, kdykoli je potřeba
    • Kód na jedno použití
  • Skript

    • Kód, který bude (pravděpodobně) použit více než jednou nebo dvakrát
    • Složitý kód vyžadující více než „několik“ příkazů
    • Kód, který bude muset spravovat ostatní
    • Kód, kterému ostatní rozumějí
    • Kód, který má být spuštěn bez obsluhy (například z cron )

Vidím značný počet otázek zde na unix.SE, které žádají o jednořadý pro provedení konkrétního úkolu. Na základě výše uvedených příkladů si myslím, že druhý je mnohem srozumitelnější než první, a proto se z něj čtenáři mohou dozvědět více. Jedno řešení lze snadno odvodit od druhého, takže v zájmu čitelnosti (pro budoucí čtenáře) bychom se pravděpodobně měli vyvarovat poskytování kódu vtěsnaného do jednoho řádku pro cokoli jiného než ta nejtriviálnější řešení.

Související:rozšíření cesty bash/shell pro mkdir, touch atd?
Linux
  1. Kontrola, zda skript běží?

  2. Zdrojový kód Netstatu?

  3. Jak testovat PHP skript

  1. Ruby skript jako služba

  2. Co je :-!! v C kódu?

  3. Porovnávání vzorů skriptů Bash

  1. Převod kódu Python 2 na Python 3

  2. Jak ladit Bash skript?

  3. Startovací skript postgresql Systemd