10 καλές συνήθειες στη χρήση του τερματικού (Μέρος 2)

Σε συνέχεια του προηγούμενου άρθρου, στο παρόν άρθρο θα γίνει λόγος για 5 ακόμη συνήθειες που θα βελτιώσουν σημαντικά το workflow σας, είτε είστε αρχάριος χρήστης ή παντοδύναμος sysadmin.

10-kales-sinithies-sto-termatiko

Μαζέψτε τις εντολές σας μαζί σε μια λίστα

Τα περισσότερα κελύφη έχουν τρόπους να μαζεύουν μαζί τις εντολές που δίνουμε σε μια λίστα, ώστε το συνολικό αποτέλεσμα αυτών (το output να τα λέμε και λίγο πιο «επιστημονικά») να πηγαίνει στη συνέχεια που ορίζεται με τον control operator | (pipel) ή αλλιώς να ανακατευθύνεται κάποια ή και όλες οι εντολές του στο ίδιο μέρος.

Τρέξτε μια λίστα εντολών σε ένα υποκέλυφος (subshell)

Χρησιμοποιήστε παρενθέσεις για να συμπεριλάβετε μια λίστα εντολών σε ένα group. Έτσι μας δίνεται η δυνατότητα να τρέξουμε τις εντολές σε ένα νέο υποκέλυφος και μας επιτρέπεται να ανακατευθύνουμε ή να πάρουμε ολόκληρο το output όπως φαίνεται και στο ακόλουθο παράδειγμα.

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && \
> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) \
> | mailx admin -S "Archive contents"

Σε αυτό το παράδειγμα τα περιεχόμενα του συμπιεσμένου αρχείου αποσυμπιέζονται στην τοποθεσία tmp/a/b/c/ και το αποτέλεσμα των κατηγοριοποιημένων εντολών, μαζί με τη λίστα των αρχείων που αποσυμπιέστηκαν, αποστέλλονται με email στον admin.

Η χρήση του υποκελύφους προτιμάται σε περιπτώσεις όπου επαναπροσδιορίζουμε τις μεταβλητές του περιβάλλοντος (enviroment variables) στη λίστα των εντολών μας και δε θέλουμε αυτοί οι προσδιορισμοί να έχουν εφαρμογή στο τρέχον κέλυφος μας.

Τρέξτε μια λίστα εντολών στο τρέχον κέλυφος

Χρησιμοποιήστε άγκιστρα ({}) για να συμπεριλάβετε τη λίστα των εντολών που θέλετε να εκτελεστεί στο τρέχον κέλυφος. Σιγουρευτείτε ότι αφήνετε κενά μεταξύ των άγκιστρων και των εντολών γιατί διαφορετικά το κέλυφος δεν θα ερμηνεύσει σωστά τα άγκιστρα. Επίσης η τελευταία εντολή, πάντοτε πρέπει να τελειώνει με ερωτηματικό (;) (semicolon) όπως φαίνεται και στο παρακάτω παράδειγμα.

~ $ { cp ${VAR}a . && chown -R guest.guest a && \
> tar cvf newarchive.tar a; } | mailx admin -S "New archive"

Χρησιμοποιήστε το xargs συνδυαστικά με το find

Χρησιμοποιήστε το εργαλείο xargs σαν φίλτρο για να κάνετε καλύτερη χρήση των αποτελεσμάτων της εντολής find. Η εντολή find τρέχει και στο τέλος παρέχει μια λίστα που ανταποκρίνεται σε κάποια κριτήρια. Αυτή η λίστα περνάει στο xargs, το οποίο με τη σειρά του τρέχει άλλες χρήσιμες εντολές με τη λίστα αυτών των αρχείων σαν arguments όπως θα δούμε και στο παράδειγμα.

$ ls
one.c  one.h  two.c  two.h
$ find . -name "*.c" | xargs rm -rf
$ ls
one.h  two.h

Παρόλα αυτά μη θεωρείτε το xargs σαν έναν βοηθό του find, αλλά σαν ένα από αυτά τα αναξιοποίητα εργαλεία που όμως άπαξ και τα συνηθίσετε, θα θέλετε να δοκιμάσετε τα πάντα συμπεριλαμβανομένων και των παρακάτω χρήσεων.

Δημιουργία μιας χωρο-οριοθετημένης λίστας

Στην απλούστερη του επίκληση, το xargs είναι ένα φίλτρο που παίρνει ως input μια λίστα. Μια από τις χρήσεις του είναι να τοποθετήσει τα τμήματα αυτής σε μια χωρο-οριοθετημένη γραμμή (ή περισσότερες) αναλόγως τα flags που θα ορίσουμε.

~$ echo part1 part2 part3 | xargs -n 1 > file.txt
~$ cat file.txt 
part1
part2
part3
~ $

Στο άνωθεν παράδειγμα πήραμε 3 λέξεις και τις βάλαμε σε λίστα με κάθε 1 από αυτές σε ξεχωριστή γραμμή. Αυτό έγινε με τη χρήση του flag -n 1 και στη συνέχεια το αποτέλεσμα εισήχθη στο αρχείο file.txt

Μπορείτε να στείλετε το αποτέλεσμα οποιουδήποτε εργαλείου που εξάγει ως output ονόματα αρχείων μέσω του xargs και να πάρετε μια λίστα από arguments για κάποιο άλλο εργαλείο που παίρνει ονόματα αρχείων σαν arguments. Ακόμη μπορείτε να δείτε τον τύπο των αρχείων που υπάρχουν σε ένα φάκελο. Για παράδειγμα:

~$ ls -1 | xargs
Adapta Desktop Documents Downloads examples.desktop file.txt jd2 Latex tutorials MEGA Music Pictures Public Release.key spec-saved-state.json Templates Videos VirtualBox VMs
~$ ls -1 | xargs file
Adapta:                directory
Desktop:               directory
Documents:             directory
Downloads:             directory
examples.desktop:      UTF-8 Unicode text
file.txt:              ASCII text, with very long lines
jd2:                   directory
Latex:                 cannot open `Latex' (No such file or directory)
tutorials:             cannot open `tutorials' (No such file or directory)
MEGA:                  directory
Music:                 directory
Pictures:              directory
Public:                directory
Release.key:           PGP public key block Public-Key (old)
spec-saved-state.json: ASCII text, with no line terminators
Templates:             directory
Videos:                directory
VirtualBox:            cannot open `VirtualBox' (No such file or directory)
VMs:                   cannot open `VMs' (No such file or directory)

Η εντολή xargs είναι χρήσιμη για κάτι παραπάνω από ένα πέρασμα ονομάτων αρχείων. Χρησιμοποιήστε την οποιαδήποτε στιγμή για να φιλτράρετε κείμενο σε μια μονή γραμμή ή όσες γραμμές θέλετε με τη χρήση του flag -l και τον αριθμό των γραμμών. Παράδειγμα.

~$ ls -l becoming_i/ | xargs -l1
total 72
drwxrwxr-x 13 becoming_i becoming_i 4096 Απρ 21 12:15 Adapta
drwxr-xr-x 2 becoming_i becoming_i 4096 Μάι 10 22:24 Desktop
drwxr-xr-x 2 becoming_i becoming_i 4096 Φεβ 5 11:41 Documents
drwxr-xr-x 4 becoming_i becoming_i 4096 Μάι 11 10:37 Downloads
-rw-r--r-- 1 becoming_i becoming_i 8980 Φεβ 5 11:34 examples.desktop
drwxrwxr-x 17 becoming_i becoming_i 4096 Απρ 18 12:20 jd2
drwxrwxr-x 3 becoming_i becoming_i 4096 Απρ 15 16:45 Latex tutorials
drwxrwxr-x 19 becoming_i becoming_i 4096 Μάι 10 20:09 MEGA
drwxr-xr-x 2 becoming_i becoming_i 4096 Φεβ 5 11:41 Music
drwxrwxrwx 2 becoming_i becoming_i 4096 Απρ 18 16:54 Pictures
drwxr-xr-x 2 becoming_i becoming_i 4096 Φεβ 5 11:41 Public
-rw-rw-r-- 1 becoming_i becoming_i 1102 Απρ 26 17:03 Release.key
-rw-rw-r-- 1 becoming_i becoming_i 132 Απρ 5 13:56 spec-saved-state.json
drwxr-xr-x 2 becoming_i becoming_i 4096 Φεβ 5 11:41 Templates
drwxr-xr-x 2 becoming_i becoming_i 4096 Φεβ 5 11:41 Videos
drwxrwxr-x 3 becoming_i becoming_i 4096 Μάι 11 09:00 VirtualBox VMs


 

Να ξέρετε πότε το grep πρέπει να μετράει και πότε να κάνει μόκο

Αποφύγετε τη χρήση του grep όταν στο τέλος της εντολής έχετε wc -l για να μετρήσετε τις γραμμές του output. Η παράμετρος -c μετράει της γραμμές που ταιριάζουν στο δοθέν μοτίβο και γενικότερα είναι ταχύτερο από το wc.

linux-tips-good-habits-terminal-meros-2o-grep

Επιπρόσθετα με τον παράγοντα ταχύτητα, η επιλογή -c είναι καλύτερος τρόπος να κάνουμε το μέτρημα. Σε πολλαπλά αρχεία το grep με την επιλογή -c επιστρέφει ξεχωριστό μέτρημα για κάθε αρχείο ένα σε κάθε γραμμή την ίδια στιγμή που το wc τα δίνει συγκεντρωτικά.

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

~$ grep -o and longFile.txt | wc -l
5928

Βρείτε συγκεκριμένα τμήματα και όχι μόνο τις γραμμές

Ένα εργαλείο σαν το awk είναι προτιμότερο από το grep όταν θέλουμε να βρούμε κάτι σε ένα συγκεκριμένο πεδίο στις γραμμές του output και όχι οπουδήποτε μέσα σε αυτές.

linux-tips-good-habits-terminal-meros-2o-ls-grep

Εδώ αν είχαμε ένα αρχείο που το όνομα του εμπεριείχε το «Απρ» θα εμφανίζονταν και αυτό μέσα στα αποτελέσματα αλλά ενδεχομένως να μην το επιθυμούσαμε. Δηλαδή αν ο στόχος μας ήταν να βρούμε τα αρχεία που δημιουργήθηκαν/τροποποιήθηκαν το μήνα Απρίλιο, τότε με το grep στην προκειμένη περίπτωση απλώς ήμασταν τυχεροί. Για να είμαστε σίγουροι αρκεί να χρησιμοποιήσουμε το awk όπως φαίνεται στην εικόνα που ακολουθεί.

linux-tips-good-habits-terminal-meros-2o-awk

Περισσότερα για το awk μπορείτε να διαβάσετε εδώ.

Μη χρησιμοποιείτε στο output τα αποτελέσματα των cat

Μια κακή συνήθεια στη χρήση του grep είναι να στέλνουμε τα αποτελέσματα του cat ενός αρχείου στο grep για να ψάξουμε μέσα σε ένα αρχείο. Αυτή η τακτική είναι απολύτως αχρείαστη και χάσιμο χρόνου γιατί εργαλεία σαν το grep παίρνουν τα ονόματα αρχείων ως arguments. Απλούστατα δε χρειάζεται να βάλουμε το cat σε αυτή την περίπτωση όπως θα δούμε και στο παράδειγμα.

~ $ time cat tmp/a/longfile.txt | grep and
2811

real    0m0.015s
user    0m0.003s
sys     0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811

real    0m0.010s
user    0m0.006s
sys     0m0.004s
~ $

Επίλογος

Καλό είναι να αναζητήσουμε τις συνήθειες μας στη χρήση του τερματικού για τυχόν κακή χρήση. Οι κακές συνήθειες μας καθυστερούν και συχνά μας οδηγούν σε απροσδόκητα λάθη. Τα 10 tips που είδαμε σε αυτά τα άρθρα μπορούν να μας βοηθήσουν να αποφύγουμε συνήθη λάθη και η υιοθέτηση αυτών είναι ένα θετικό βήμα προς την βελτίωση των ικανοτήτων μας στη γραμμή εντολών.

3 thoughts on “10 καλές συνήθειες στη χρήση του τερματικού (Μέρος 2)

Απορίες, παρατηρήσεις, ιδέες... Ελεύθερα ! Πες την άποψή σου... έστω και Ανώνυμα:

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s