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

Εισαγωγή

Η καθημερινή χρήση του linux αλλά και των unix-like συστημάτων είναι άρρηκτα συνδεδεμένη με τη χρήση του τερματικού. Εντολές έναντι εντολών, παράμετροι έναντι παραμέτρων, αρκετές φορές μας ζαλίζουν αλλά και στους πιο αρχάριους η μπάλα δεν αργεί να χαθεί. Ιδιαίτερα δε όσοι ακολουθούν τις 10 καλές συνήθειες στη χρήση του τερματικού θα χρειαστούν σίγουρα καλό μνημονικό.

Στο παρόν άρθρο θα δούμε πόσο χρήσιμη είναι η αρχειοθέτηση των εντολών του τερματικού bash (το οποίο είναι εξορισμού ενεργό σε όλες τις διανομές) αλλά και γιατί είναι καλή η υιοθέτηση μιας τέτοιας συνήθειας. Επιπλέον θα δούμε πόσο χρήσιμη είναι η εντολή history σε περιπτώσεις που η χρήση του τερματικού δεν είναι συχνή.

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

Advertisements

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, η οποία μόλις εκτελεστεί στο τερματικό μας επιστρέφει

history
Το output της εντολής history

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

!1377

Χωρίς να χρειαστεί να τη ξαναγράψω. Βεβαίως η εντολή που εξαναγκάσαμε σε επανεκτέλεση δεν ήταν κάτι μακρύ ή δύσκολο αλλά σκεφτείτε πόσο χρήσιμο μπορεί να είναι σε εντολές μακρυνάρια που δεν είναι λίγες οι φορές που τις γράψαμε , τα κάναμε μαντάρα και ύστερα ψάχναμε να δούμε τι έγινε. Για τον παρατηρητικό όμως αναγνώστη, υπάρχει ένα λάθος το οποίο φυσικά θα αφήσουμε να το βρείτε εσείς :)

Φυσικά αν θέλουμε να φιλτράρουμε το αποτέλεσμα, (έστω ότι θυμόμαστε μονο ένα κομμάτι μιας μακροσκελούς εντολής) μπορούμε να χρησιμοποιήσουμε π.χ. μια λέξη και να την διοχετεύσουμε στο grep :

history | grep <μια λέξη>

Πλέον με την χρήση της history ξεχάστε τα.

Ιστορία μου, αμαρτία μου…

…λάθος μου μεγάλο, εχμ θέλω να πω ότι αν δεν θέλουμε να κρατάμε το ιστορικό του τερματικού μας για τον οποιοδήποτε λόγο (ο υπολογιστής είναι δημόσιος ή δεν χρησιμοποιείται αποκλειστικά από εμάς), τότε καθαρίζουμε το ιστορικό δίνοντας

history -c && history -w

διαγράφοντας επιτυχώς το ιστορικό του τερματικού μας.

Bonus: Ξεκινήστε χωρίς ιστορικό κάθε νέο session του bash

Πολύ απλά ανοίγοντας το αρχείο .profile στον /home φάκελο σας και προσθέτοντας στο τέλος του αρχείου

rm -f .bash_history

και έτσι κάθε φορά που θα κάνετε login θα ξεκινάτε με καθαρό ιστορικό.

Επίλογος

Η συγκεκριμένη τακτική θα σπαταλήσει λίγα δευτερόλεπτα από το χρόνο σας, αλλά θα σας σώσει από αρκετό ψάξιμο στο μέλλον. Μάλιστα σε συνδυασμό με την εντολή history πότε ξανά δε θα βρεθείτε χαμένοι στις σκέψεις σας ή στις γραμμές του τερματικού σας. Δοκιμάστε το και βέβαιο είναι ότι πληκτρολόγηση των ίδιων εντολών ξανά και ξανά θα είναι ιστορία.


Παραπομπές: