moreutils: Οι ξεχασμένες εντολές

Μαζί με το UNIX πήραμε πολλές εντολές για χρήση στο τερματικό. Αλλά κάποιες χρήσιμες δυνατότητες ποτέ δεν προστέθηκαν. Αυτό το κενό καλύπτει το έργο moreutils.

Οι εντολές

  • chronic - Τρέχει μια εντολή και δε δείχνει τίποτα έκτος αν αποτύχει
  • combine - Συνδιάζει δυο αρχεία κειμένου με λογικούς τελεστές
  • errno - Δείχνει περιγραφές για αριθμούς σφαλμάτων
  • ifdata - Ένας άλλος τρόπος να πάρουμε πληροφορίες για την κάρτα δικτύου
  • ifne - Εκτέλεση ενός προγράμματος μόνο αν η είσοδος είναι κενή
  • isutf8 - Ελέγχει αν ένα αρχείο (ή μια ροή εισόδου) είναι σε utf-8.
  • lckdo - Τρέχει ένα πρόγραμμα μετά από θα κάνει ένα κλείδωμα.
  • mispipe - Διασωλήνωση και επιστροφή του κωδικού λάθους της πρώτης εντολής.
  • parallel - Τρέχει πολλά προγράμματα σε παραλληλία.
  • pee - tee για ροές εισόδου.
  • sponge - Soak up την είσοδο και γράψιμο σε αρχείο.
  • ts - Προσθήκη timestamp στη ροή εισόδου
  • vidir - Διόρθωσή ονομάτων αρχείων καταλόγου με επεξεργαστή κειμένου.
  • vipe - Προσθήκη ενός επεξεργαστή κειμένου σε μια διασωλήνωση.
  • zrun - Αυτόματη αποσυμπίεση ορισμάτων μιας εντολής.

Οι εντολές αυτές (θα δούμε τι κάνουν για μερικές) δεν είναι διαθέσιμες συνήθως και θα πρέπει να εγκατασταθούν. Το πακέτο έχει όνομα moreutils. Κάτι που είναι κρίμα γιατί δεν μπορείς να τις χρησιμοποιήσεις πάντα σε κάποιο πρόγραμμα κελύφους.

compine

Παίρνει δυο αρχεία και κάνει λογικές πράξεις με τα περιεχόμενα τους. Για παράδειγμα, να βρούμε τις γραμμές που υπάρχουν και στα δύο αρχεία, τις γραμμές που υπάρχουν μόνο σε ένα αρχείο κλπ… Οι τελεστές που υποστηρίζει είναι and, not, or, xor. Την έχω χρησιμοποιήσει για να βρω διαφορές ανάμεσα στα περιεχόμενά δυο καταλόγων.

compine file1 <op> file2

ifdata

Αξίζει να την τρέξεις με ένα --help να βρεις πόσα πράγματα μπορεί να κάνει. Για παράδειγμα, για να βρω το MTU θα δώσω

ifdata -pm enp5s0

Θα μπορούσα να πάρω την ίδια πληροφορία με πολλά grep, αλλά έτσι είναι ευκολότερο.

pee

Παίρνει μια είσοδο και την κάνει κλωνοποίηση σε μια η περισσότερες εξόδους. Μοιάζει με την γνωστή tee αλλά αντί να στέλνει την έξοδο σε αρχείο τη στέλνει σε άλλα προγράμματα.

echo "Hello" | pee cat wc
echo "Linux is Fun!" | pee cat 'cut -d" " -f1'

sponge

Παίρνει την είσοδο και τη γράφει σε ένα αρχείο. Μα αυτό δεν κάνει και μια ανακατεύθυνση; Υπάρχει μια μικρή αλλά κρίσιμη διαφορά, η sponge θα περιμένει να συγκεντρωθεί όλη η πληροφορία στην είσοδο πρώτα. Πολύ χρήσιμο σε προγράμματά κελύφους σε κάποιες περιπτώσεις.

ts

Μια απλή εντολή που προσθέτει χρόνο στην είσοδο. Την έχω χρησιμοποιήσει πολλές φορές για το debug του φτωχού: Εντολές print μέσα στον κώδικα

ping -c 2 linux-user.gr | ts

vidir

Μόνο για αυτήν την εντολή αξίζει να εγκαταστήσεις το πακέτο. Λειτουργεί ως εξής: Παίρνει μια λίστα αρχείων ή ένα όνομα φακέλου και ανοίγει μια λίστα αρχείων σε ένα επεξεργαστή κειμένου. Εδώ μπορούμε να αλλάξουμε τα ονόματα των αρχείων ή ακόμα και να σβήσουμε κάποια. Με την αποθήκευση του αρχείου οι αλλαγές θα εφαρμοστούν στο σύστημα των αρχείων.

find | vidir

Μια βελτιωμένη έκδοση της εντολής υπάρχει εδώ:
GitHub - bulletmark/edir: Program to rename, remove, and copy files and directories using your editor

vipe

Γιατί πάντα δεν ήθελες να προσθέσεις ένα vi στη μέση μιας διασωλήνωσης για να δεις πως τα πάντα πάνε καλά ή να διορθώσεις με το χέρι μια παράξενη περίπτωση;

Περισσότερες εντολές

Ελπίζω με τη σύντομη αυτή παρουσίαση να πήρατε χρήσιμες ιδέες και εντολές για το επόμενο πρόγραμμα σας σε bash. Δεν είναι όλλες τόσο χρήσιμες, αλλά όσο μεγαλύτερη είναι η εργαλειοθήκη σου τόσο πιθανότερο να βρεις το σωστό πρόγραμμα για τη σωστή χρήση.

Για περισσότερα:

2 «Μου αρέσει»

Ωραία συλλογή εργαλείων. Βέβαια αν και τις έχω στο PATH δεν έχει τύχει να χρησιμοποιήσω καμία αυτές (επειδή ξεχνάω πως υπάρχουν).

Το cmd | sponge file βασικά δουλεύει σαν cmd > .tmp && mv .tmp file (διατηρώντας ωστόσο δικαιώματα και λαμβάνοντας υπόψιν αν είναι κάποιο link). Η κύρια χρησιμότητα του είναι πως επιτρέπει pipes που μπορούν να διαβάσουν και να γράψουν στο ίδιο αρχείο εάν δεν υποστηρίζεται από την ίδια την εντολή.

Π.χ. το sed {} file | sponge file είναι αντίστοιχο του (GNU) sed -i {} file. Άμα κάποιος έκανε sed {} file > file θα προέκυπτε ένα κενό αρχείο γιατί το shell κόβει το output αρχείο πριν τρέξει η εντολή, ενώ εάν κάποιος έκανε sed {} file | tee file το αρχείο θα κοβόταν στο μέγεθος του buffer.

Το pee είναι ενδιαφέρον από την άποψη πως είναι αχρείαστο σε bash. To cmd0 | pee "cmd1" "cmd2" είναι σαν cmd0 | cmd1; cmd0 | cmd2. Αλλά καθώς το bash μπορεί να “γράψει” σε εντολές σαν να είναι αρχείο κάποιος μπορεί να χρησιμοποιήσει cmd0 | tee >(cmd1) >(cmd2).

Π.χ. σε bash η cat /proc/cpuinfo | pee "grep 'model name' | head -1" "grep 'cpu MHz'" λειτουργεί όπως η cat /proc/cpuinfo | tee >(grep 'model name' | head -1) >(grep 'cpu MHz') >/dev/null. (Αν και το pee φαίνεται τρέχει τις δυο εντολές παράλληλα.)

2 «Μου αρέσει»

Δεν είναι ισοδύναμο. Η εντολή cmd0 θα εκτελεστεί δυο φορές. Ενδιαφέρον το παράδειγμα με τη χρήση της tee, δεν το είχα σκεφτεί.

Πολλές από αυτές τις εντολές μπορούν να αντικατασταθούν με bash-isms ή με προχωρημένη χρήση των GNU tools. Αλλά είτε κάνουν τα πράγματα ευκολότερα είτε μπορείς να κάνεις πράγματα που σε ένα UNIX/POSIX σύστημα δεν μπορείς. Τα moreutils είναι παλιά.

ΥΓ: Κύδος για την περιγραφή της sponge :slight_smile:

1 «Μου αρέσει»

Όχι δεν εννοούσα πως είναι ίδιο με αυτή αλλά με τη | tee >(). Αυτό το έγραψα για να γίνει κατανοητό τι αποτέλεσμα έχει. Και με τις δύο εκδοχές, ναι, το σημαντικό είναι πως η πρώτη εντολή τρέχει μόνο μια φορά.