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 jesed
,awk
,perl
a/nebo nástroje jakogrep
nebocut
nebosort
.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?