Σε συνέχεια του προηγούμενου άρθρου, στο παρόν άρθρο θα γίνει λόγος για 5 ακόμη συνήθειες που θα βελτιώσουν σημαντικά το workflow σας, είτε είστε αρχάριος χρήστης ή παντοδύναμος sysadmin.
Μαζέψτε τις εντολές σας μαζί σε μια λίστα
Τα περισσότερα κελύφη έχουν τρόπους να μαζεύουν μαζί τις εντολές που δίνουμε σε μια λίστα, ώστε το συνολικό αποτέλεσμα αυτών (το 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.
Επιπρόσθετα με τον παράγοντα ταχύτητα, η επιλογή -c είναι καλύτερος τρόπος να κάνουμε το μέτρημα. Σε πολλαπλά αρχεία το grep με την επιλογή -c επιστρέφει ξεχωριστό μέτρημα για κάθε αρχείο ένα σε κάθε γραμμή την ίδια στιγμή που το wc τα δίνει συγκεντρωτικά.
Ωστόσο ασχέτως από θέματα ταχύτητας, το παραπάνω παράδειγμα αναδεικνύει ένα ακόμη λάθος που πρέπει να αποφεύγεται, Αυτές οι μέθοδοι μέτρησης δίνουν αποτελέσματα τους αριθμούς των γραμμών που περιέχουν το μοτίβο της αναζήτησης. Αν αυτό είναι το ζητούμενο τότε κανένα πρόβλημα. Ειδάλλως σε περιπτώσεις που οι γραμμές περιέχουν πολλαπλές καταχωρήσεις του μοτίβου της αναζήτησης, τότε δεν παίρνουμε ως αποτέλεσμα τον αριθμό των μοτίβων που αναζητούμε αλλά των αριθμό των γραμμών που βρίσκονται αυτές. Εδώ προτιμάται η χρήση της wc. Δηλαδή
~$ grep -o and longFile.txt | wc -l 5928
Βρείτε συγκεκριμένα τμήματα και όχι μόνο τις γραμμές
Ένα εργαλείο σαν το awk είναι προτιμότερο από το grep όταν θέλουμε να βρούμε κάτι σε ένα συγκεκριμένο πεδίο στις γραμμές του output και όχι οπουδήποτε μέσα σε αυτές.
Εδώ αν είχαμε ένα αρχείο που το όνομα του εμπεριείχε το «Απρ» θα εμφανίζονταν και αυτό μέσα στα αποτελέσματα αλλά ενδεχομένως να μην το επιθυμούσαμε. Δηλαδή αν ο στόχος μας ήταν να βρούμε τα αρχεία που δημιουργήθηκαν/τροποποιήθηκαν το μήνα Απρίλιο, τότε με το grep στην προκειμένη περίπτωση απλώς ήμασταν τυχεροί. Για να είμαστε σίγουροι αρκεί να χρησιμοποιήσουμε το 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 που είδαμε σε αυτά τα άρθρα μπορούν να μας βοηθήσουν να αποφύγουμε συνήθη λάθη και η υιοθέτηση αυτών είναι ένα θετικό βήμα προς την βελτίωση των ικανοτήτων μας στη γραμμή εντολών.
find . -name «*.c» | xargs rm -rf
βγαλε το -f μην εχουμε κανα ατυχημα :P
Χαχα !!!
Άστο δεν πειράζει, μ´αρέσει να ζω επικίνδυνα :P
I also like to live dangerously.
I’ll have you know that i only use Terminal in sudo su mode…