GNU/Linux >> Linux Esercitazione >  >> Linux

Script contro una riga?

Ho notato molte domande, risposte e commenti che esprimono disprezzo (e talvolta anche paura) per la scrittura di sceneggiature anziché battute. Quindi, vorrei sapere:

  • Quando e perché dovrei scrivere una sceneggiatura a sé stante piuttosto che un "one-liner"? O viceversa?

  • Quali sono i casi d'uso e i pro e i contro di entrambi?

  • Alcuni linguaggi (ad es. awk o perl) sono più adatti a one-liner rispetto ad altri (ad es. Python)? Se sì, perché?

  • È solo una questione di preferenze personali o ci sono buone ragioni (cioè oggettive) per scrivere l'una o l'altra in circostanze particolari? Quali sono questi motivi?

Definizioni

  • one-liner :qualsiasi sequenza di comandi digitati o incollati direttamente in una riga di comando della shell . Spesso implicano pipeline e/o l'uso di linguaggi come sed , awk , perl e/o strumenti come grep o cut o sort .

    È l'esecuzione diretta sulla riga di comando che è la caratteristica distintiva:la lunghezza e la formattazione sono irrilevanti. Un "one-liner" può essere tutto su una riga o può avere più righe (ad es. sh for loop o codice awk o sed incorporato, con avanzamenti di riga e indentazione per migliorare la leggibilità).

  • script :qualsiasi sequenza di comandi in qualsiasi lingua interpretata che viene salvata in un file , e quindi eseguito. Uno script può essere scritto interamente in una lingua o può essere un wrapper di script di shell attorno a più "one-liner" che utilizzano altre lingue.

Ho la mia risposta (che posterò in seguito), ma voglio che questa diventi una domanda e risposta canonica sull'argomento, non solo la mia opinione personale.

Risposta accettata:

Un'altra risposta basata sull'esperienza pratica.

Userei un one-liner se fosse un codice "usa e getta" che potrei scrivere direttamente al prompt. Ad esempio, potrei usare questo:

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

Userei uno script se decidessi che vale la pena salvare il codice. A questo punto aggiungerei una descrizione nella parte superiore del file, probabilmente aggiungerei un controllo degli errori e forse anche controllarlo in un repository di codice per il controllo delle versioni. Ad esempio, se decidessi che il controllo del tempo di attività di un set di server era una funzione utile che avrei utilizzato ancora e ancora, la riga precedente potrebbe essere estesa a questa:

#!/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

Generalizzando, si potrebbe dire

  • Una riga

    • Codice semplice (cioè solo "poche") istruzioni), scritto per uno scopo specifico una tantum
    • Codice che può essere scritto in modo semplice e veloce ogni volta che è necessario
    • Codice usa e getta
  • copione

    • Codice che verrà (probabilmente) utilizzato più di una o due volte
    • Codice complesso che richiede più di "poche" istruzioni
    • Codice che dovrà essere mantenuto da altri
    • Codice che deve essere compreso da altri
    • Codice da eseguire automaticamente (ad esempio, da cron )

Vedo un buon numero di domande qui su unix.SE che richiedono un one-liner per eseguire un compito particolare. Usando i miei esempi sopra, penso che il secondo sia molto più comprensibile del primo, e quindi i lettori possono imparare di più da esso. Una soluzione può essere facilmente derivata dall'altra, quindi nell'interesse della leggibilità (per i futuri lettori) dovremmo probabilmente evitare di fornire codice compresso in una riga per qualcosa di diverso dalla più banale delle soluzioni.

Correlati:espansione del percorso bash/shell per mkdir, touch ecc?
Linux
  1. Come eseguire il debug di uno script Bash?

  2. Timeout in uno script di shell?

  3. Modo per incorporare un binario eseguibile in uno script di shell senza strumenti aggiuntivi?

  4. Verifica che uno script sia in esecuzione?

  5. Non riesci a ottenere il codice di uscita corretto da uno script?

Conversione del codice Python 2 in Python 3

35 Esempi di script Bash

Come eseguire uno script Bash

Directory corrente dello script Shell?

Come eseguire il codice nella shell Django da uno script Python esterno?

Script di avvio postgresql di systemd