Αν ρωτάτε συνέχεια τον εαυτό σας «Είχα δώσει μια εντολή στο τερματικό για να κάνω μια δουλειά, αλλά δεν θυμάμαι ποια ήταν» τότε είναι καίρος να χρησιμοποιήσετε το ιστορικό εντολών του τερματικού σας και μάλιστα με αποδοτικότερο τρόπο.
Εισαγωγή
Η καθημερινή χρήση του linux αλλά και των unix-like συστημάτων είναι άρρηκτα συνδεδεμένη με τη χρήση του τερματικού. Εντολές έναντι εντολών, παράμετροι έναντι παραμέτρων, αρκετές φορές μας ζαλίζουν αλλά και στους πιο αρχάριους η μπάλα δεν αργεί να χαθεί. Ιδιαίτερα δε όσοι ακολουθούν τις 10 καλές συνήθειες στη χρήση του τερματικού θα χρειαστούν σίγουρα καλό μνημονικό.
Στο παρόν άρθρο θα δούμε πόσο χρήσιμη είναι η αρχειοθέτηση των εντολών του τερματικού bash (το οποίο είναι εξορισμού ενεργό σε όλες τις διανομές) αλλά και γιατί είναι καλή η υιοθέτηση μιας τέτοιας συνήθειας. Επιπλέον θα δούμε πόσο χρήσιμη είναι η εντολή history σε περιπτώσεις που η χρήση του τερματικού δεν είναι συχνή.
Συνήθως, το αρχείο ιστορικού εντολών κρατάει έναν συγκεκριμένο αριθμό εντολών (π.χ. 1000) οπότε και οι εντολές που τρέξατε πριν 2 μήνες μάλλον χάθηκαν. Εδώ θα δούμε πως να το αλλάξουμε αυτό, αλλά και να το κάνουμε και πιο αποδοτικό και να περιλαμβάνει περισσότερες λεπτομέρειες.
Bash Configuration File
Αρχικά πρέπει να δημιουργήσουμε μια μεταβλητή περιβάλλοντος (enviroment variable) που να ξεκινά σε κάθε εκκίνηση της γραμμής εργασιών. Όπως αναφέραμε το bash είναι το default των περισσότερων διανομών και επομένως το αρχείο που θα τροποποιηθεί είναι το .bashrc το οποίο βρίσκεται στον αρχηκό μας κατάλογο (/home/user).
Σε αυτό το αρχείο μπορούμε να θέσουμε:
HISTSIZE=-1
HISTFILESIZE=-1
ώστε να μην διαγράφεται τίποτα και να μην χάνεται το ιστορικό εντολών. Αρκετοί όμως αναφέρουν οτι η παραπάνω μέθοδος δημιουργεί ένα τεράστιο αρχείο history το οποίο μπορεί να καθυστερεί εν καιρό το τερματικό μιας και το διαβάζει κάθε φορά που το ανοίγουμε. Παρόλα αυτά θα δούμε επίσης έναν τρόπο αυτό να γράφεται σε ξεχωριστό αρχείο το οποίο μπορούμε να το επεξεργαζόμαστε με όποιον κειμενογράφο θέλουμε αλλά και όσοι γνωρίζουν να το συγχρονίζουν με κάποια υπηρεσία συγχρονισμού αρχείων (π.χ. Dropbox)
PROMPT_COMMAND
Η εντολή PROMPT_COMMAND είναι μια μεταβλητή περιβάλλοντος τα περιεχόμενα της οποίας εκτελούνται πριν την εμφάνιση του bash prompt . Για παράδειγμα:
PROMPT_COMMAND="echo -n [$(date +%H:%M)]"
[18:26]
unset PROMPT_COMMAND
όπως βλέπετε με το unset επαναφερόμαστε στην πρότερη κατάσταση. Η εντολή που θα βάλουμε στο τέλος του .bashrc αρχείου
export PROMPT_COMMAND='if [ "$(id -u)" -ne 0 ]; then echo "$(date "+%Y-%m-%d.%H:%M:%S") $(pwd) $(history 1)" >> ~/.logs/bash-history-$(date "+%Y-%m-%d").log; fi'
Πρώτα ελέγχουμε ότι δεν είμαστε root χρήστες (ο root χρήστης έχει user ID 0).
Αν δεν είμαστε προστίθεται μια γραμμή που περιέχει τη τρέχουσα ημερομηνία και ώρα,τον φάκελο και την τελευταία εντολή που εκτελέστηκε σε ένα αρχείου που εμπεριέχει την τρέχουσα ημερομηνία ως όνομα αρχείου.
Αυτή η τακτική είναι βοηθά πολύ όταν προσπαθούμε να βρούμε για παράδειγμα τι τρέξαμε την τάδε μέρα και τα κάναμε μαντάρα ή το όνομα ενός φακέλου ή αρχείου που σβήσαμε κατά λάθος κτλ. πχ.
grep -h logcat ~/.logs/bash-history-2016-04*
2016-04-01.10:18:03 /Users/me 66555 adb logcat
2016-04-01.10:19:56 /Users/me 66555 adb logcat
2016-04-01.11:01:36 /Users/me 66555 adb logcat
2016-04-05.09:50:25 /Users/me/git/android-project 66368 adb logcat
2016-04-05.13:42:54 /Users/me/git/android-project 66349 adb -s emulator-5554 logcat
2016-04-06.10:40:08 /Users/me/git/android-project 66390 adb logcat
2016-04-06.10:48:54 /Users/me/git/android-project 66342 adb logcat
Αναζήτηση των εντολών που δώσατε με το history
Η προηγούμενη μέθοδος είναι χρήσιμη σε power-users και sysadmins που δίνουν αρκετές εντολές στο τερματικό τους και θέλουν να κρατούν ένα αναλυτικό αρχείο αυτών. Επειδή όμως όλοι οι χρήστες δεν ανήκουν στις εν λόγω κατηγορίες, μπορούμε πολύ πιο απλά να ξέρουμε τι εντολές δώσαμε στο τερματικό μας και να τις εκτελούμε χωρίς να χρειάζεται να τις ξαναγράψουμε. Αυτό γίνεται εύκολα με τη χρήση της εντολής history, η οποία μόλις εκτελεστεί στο τερματικό μας επιστρέφει

Παρατηρούμε ότι στην 1η στήλη εντοπίζεται μια ακολουθία αριθμών και ακριβώς δίπλα η σειρά με την οποία δόθηκαν οι εντολές στο τερματικό από την πρώτη καταγραφή έως την τελευταία. Αν θέλω πχ να εκτελέσω την εντολή 1377 το μόνο που έχω να δώσω στο τερματικό είναι
!1377
Χωρίς να χρειαστεί να τη ξαναγράψω. Βεβαίως η εντολή που εξαναγκάσαμε σε επανεκτέλεση δεν ήταν κάτι μακρύ ή δύσκολο αλλά σκεφτείτε πόσο χρήσιμο μπορεί να είναι σε εντολές μακρυνάρια που δεν είναι λίγες οι φορές που τις γράψαμε , τα κάναμε μαντάρα και ύστερα ψάχναμε να δούμε τι έγινε. Για τον παρατηρητικό όμως αναγνώστη, υπάρχει ένα λάθος το οποίο φυσικά θα αφήσουμε να το βρείτε εσείς :)
Φυσικά αν θέλουμε να φιλτράρουμε το αποτέλεσμα, (έστω ότι θυμόμαστε μονο ένα κομμάτι μιας μακροσκελούς εντολής) μπορούμε να χρησιμοποιήσουμε π.χ. μια λέξη και να την διοχετεύσουμε στο grep :
history | grep <μια λέξη>
Πλέον με την χρήση της history ξεχάστε τα.
Ιστορία μου, αμαρτία μου…
…λάθος μου μεγάλο, εχμ θέλω να πω ότι αν δεν θέλουμε να κρατάμε το ιστορικό του τερματικού μας για τον οποιοδήποτε λόγο (ο υπολογιστής είναι δημόσιος ή δεν χρησιμοποιείται αποκλειστικά από εμάς), τότε καθαρίζουμε το ιστορικό δίνοντας
history -c && history -w
διαγράφοντας επιτυχώς το ιστορικό του τερματικού μας.
Bonus: Ξεκινήστε χωρίς ιστορικό κάθε νέο session του bash
Πολύ απλά ανοίγοντας το αρχείο .profile στον /home φάκελο σας και προσθέτοντας στο τέλος του αρχείου
rm -f .bash_history
και έτσι κάθε φορά που θα κάνετε login θα ξεκινάτε με καθαρό ιστορικό.
Επίλογος
Η συγκεκριμένη τακτική θα σπαταλήσει λίγα δευτερόλεπτα από το χρόνο σας, αλλά θα σας σώσει από αρκετό ψάξιμο στο μέλλον. Μάλιστα σε συνδυασμό με την εντολή history πότε ξανά δε θα βρεθείτε χαμένοι στις σκέψεις σας ή στις γραμμές του τερματικού σας. Δοκιμάστε το και βέβαιο είναι ότι πληκτρολόγηση των ίδιων εντολών ξανά και ξανά θα είναι ιστορία.
Παραπομπές:
- Bash History Facilities (gnu.org)
- How (and Why) to Log Your Entire Bash History (spin.atomicobject.com)
Πολύ χρήσιμο. Ένα «κόλπο» που χρησιμοποιώ για να ψάχνω εντολές που θυμάμαι πως αρχίζουν είναι, αφού κάνω uncomment τις σειρές “\e[5~”: history-search-backward και
“\e[6~”: history-search-forward στο /etc/inputrc, να ξεκινάω να γράφω τα πρώτα γράμματα και κατόπιν με pageup ή pagedown μου βγάζει όλες τις εντολές που έχω δώσει και ξεκινάνε από τα συγκεκριμένα γράμματα. Περιτό να πω ότι μέσα στα αρχεία που κάνω backup και βάζω σε κάθε νέα εγκατάσταση είναι και το bash history, που πρέπει να …κουβαλάω 4-5 χρόνια τώρα από εγκατάσταση σε εγκατάσταση :P
Αν δεν κάνω λάθος, αυτο μπορείς να το κάνεις χωρίς uncomment απλά πατώντας στο τερματικό ctrl+r
Ενδιαφέρον, δεν το ήξερα. Κάτι δεν κάνω όμως καλά γιατί δε μου αλλάζει εντολές, με το spacebar αλλάζει στην προηγούμενη και μετά μου σταματάει. Θα συνεχίσω το ψάξιμο ;)
Εδώ είναι η απάντηση Ειρήνη.
https://goo.gl/2u0FYi
Την είχα πατήσει κι εγώ παλιότερα και δεν ήξερα τι έφταιγε.
Ctrl+R (reverse search) – Ctrl+S (Forward Search)
Ευχαριστώ Νίκο :)