Tips για την γραμμή εντολής.: Aliases
Description: This is issue 34 of Magaz, the Hellenic LinuxMagazine
Keywords: magaz hellenic greek hellas greece hellug linux magazine

Magaz, The Greek Linux Magazine
Τεύχος #34
Περιληπτικά Περιεχόμενα Αναλυτικά Περιεχόμενα Mirrors Links Πληροφορίες Συντάκτες Αναζήτηση Επικοινωνία
Επόμενο Περιεχόμενα ### 1. Aliases Τα παρακάτω aliases μπορούν να μπουν στο ~/.bashrc. Αν όμως γίνουν πολλά, είναι καλύτερα για λόγους τάξης να μπουν σε ένα ξεχωριστό αρχείο, π.χ. στο ~/.alias και να μπει στο ~/.bashrc η γραμμή:
    test -s ~/.alias && . ~/.alias
### 1.1 ls
    alias l='ls -lA '
    alias lh='l -h '
Ο διακόπτης -h της ls είναι αρκετά χρήσιμος γιατί μετατρέπει το μέγεθος αρχείων σε kB,MB,GB. Έτσι, με 'l ~/mbox' θα πάρω το παρακάτω:
    -rw-------    1 manolis  users      135987 Ιούλ 28 22:33 /home/manolis/mbox
Ενώ με 'lh ~/mbox' το παρακάτω:
    -rw-------    1 manolis  users        133k Ιούλ 28 22:33 /home/manolis/mbox
### 1.2 less
    alias m='$PAGER'
Όπου η μεταβλητή PAGER έχει τεθεί στο ~/.bashrc ως εξής:
    export PAGER='less -rM '
Ή ό,τι άλλο χρησιμοποιείται ως pager τέλος πάντων. Εξαιρετικά βολικό, χρησιμοποιώ το less αμέτρητες φορές κάθε μέρα. ### 1.3 pushd, popd, dirs
    alias pd='pushd'
    alias po='popd'
    alias ds='dirs -v'
Χρήσιμα για τις ...περιπλανήσεις μας στη δομή αρχείων του linux. Οι εντολές pushd, popd, dirs χειρίζονται μια στοίβα (stack) καταλόγων στους οποίους μετακινούμαστε. Με την εντολή 'pushd dir' μεταφερόμαστε στον κατάλογο dir και τοποθετείται αυτός στην κορυφή της στοίβας. Με την εντολή popd αφαιρείται ο κατάλογος που βρίσκεται στην κορυφή της στοίβας και μεταφερόμαστε σ' αυτόν που θα γίνει η νέα κορυφή. Με την εντολή dirs βλέπουμε τα περιεχόμενα της στοίβας. Ένα παράδειγμα θα γίνει πιο εύκολα κατανοητό:
    $ pd /tmp/
    /tmp ~
Ξεκινώντας ένα νέο shell βρίσκομαι στο home directory. Κάνω push το /tmp. Παρατηρώ ότι η pushd μου αναφέρει και την κατάσταση της στοίβας: Στην κορφή βρίσκεται το /tmp και μετά το home από όπου ξεκίνησα.
    $ pd /usr/local/bin/
    /usr/local/bin /tmp ~
Έκανα push και το /usr/local/bin. Η στοίβα τώρα έχει τρεις καταλόγους.
    $ ds
    0 /usr/local/bin
    1 /tmp
    2 ~
Ας υποθέσουμε τώρα ότι θέλω να εναλλάσομαι γρήγορα μεταξύ αυτών των καταλόγων. Με ένα pushd +n (όταν χρησιμοποιήσουμε την pushd χωρίς όρισμα, εννοείται +1) ο κατάλογος που βρίσκεται στη θέση n πάει στην κορυφή.
    $ pd +1
    /tmp /usr/local/bin ~
Με ένα popd ξεφορτώνομαι τον κατάλογο που βρίσκεται στην κορυφή και μεταφέρομαι στον αμέσως επόμενο.
    $ po
    /usr/local/bin ~
Με τη σωστή χρήση των pushd, popd, dirs μπορούμε να κάνουμε πολύ γρήγορα πολύπλοκες δουλειές. Και μην ξεχνάτε ότι τα πλήρη ονόματα των καταλόγων μπορεί να γίνουν πολύ μεγάλα (π.χ. /usr/X11R6/lib/X11/fonts/hellas/, ~/download/pictures/flags/greece/). Είναι πολύ βολικό να μπορεί κανείς με τρία χτυπήματα πλήκτρων να εναλάσσεται μεταξύ τους. Για περισσότερες πληροφορίες 'help pushd', 'help popd', 'help dirs'. Επίσης, ας μην ξεχνάμε και την εντολή 'cd -' που μας τοποθετεί στον προηγούμενο κατάλογο (σ' αυτόν που είμασταν πριν κάνουμε cd ή pushd/popd). ### 1.4 PATH
    alias pt='echo $PATH|tr : \\n '
    addpath() { while test "$1" ; do PATH=${PATH}:"$1" ; shift ; done ; }
Το alias pt κάνει το εξής απλό και έξυπνο: Παίρνει τη μεταβλητή PATH και την περνάει στην εντολή tr (δώστε man tr) ώστε να μετατρέψει τις άνω και κάτω τελείες που χωρίζουν τους καταλόγους του path σε αλλαγές γραμμών. Έτσι έχουμε το εξής ευανάγνωστο αποτέλεσμα:
    $ pt
    /usr/local/bin
    /usr/bin
    /usr/X11R6/bin
    /bin
    /usr/games/bin
    /opt/gnome/bin
    /opt/kde3/bin
    .
Η συνάρτηση addpath προσθέτει τα ορίσματά της στο τέλος της μεταβλητής PATH. Οι συναρτήσεις (functions) του shell είναι σαν μικρά σκριπτάκια, έχουν πιο πολλές δυνατότητες από τα απλά aliases. Εδώ όπως βλέπετε μπορούμε να χειριστούμε μία- μία όλες της παραμέτρους της addpath(). (Για περισσότερες πληροφορίες, man bash, section FUNCTIONS) ### 1.5 history Το shell μας δίνει τη δυνατότητα να επαναλάβουμε μια προηγούμενη εντολή χωρίς να χρειάζεται να την πληκτρολογήσουμε ολόκληρη. Με τα βελάκια πάνω και κάτω μπορούμε να έχουμε γρήγορη πρόσβαση στις προηγούμενες εντολές. Δίνοντας '!cmd' επαναλαμβάνεται η τελευταία εντολή που αρχιζε με τους χαρακτήρες 'cmd'. Δίνοντας 'history n' (παρεμπιμπτόντως μην ξεχάσετε το alias h='history ' στο ~/.bashrc) μας εμφανίζονται οι τελευταίες n εντολές μαζί με τον αριθμό τους. Στη συνέχεια με '!n', όπου n ο αριθμός της εντολής μπορούμε να επαναλάβουμε όποια θέλουμε. Με '!-n', όπου n αριθμός, εκτελείται η n-ιοστή προηγούμενη εντολή. Με '!!' εκτελείται η αμέσως προηγούμενη (συνώνυμο του '!-1'). (Για περισσότερες πληροφορίες, man bash, section HISTORY) ### 1.6 find
    export FIN='-printf %s\t%TY-%Tm-%Td-%TX\t%p\n'
Έχοντας αυτή τη γραμμή στο ~/.bashrc έχω πάντα στο shell μου μια μεταβλητή, την FIN. Το κείμενο της είναι μια εντολή μορφοποίησης για τα αποτελέσματα της find. Δίνοντας λοιπόν "find dir $FIN" παίρνω μια λίστα των αρχείων κάτω από τον κατάλογο dir στην εξής μορφή:
    135987  2003-07-28-22:33:13     ./mbox
Στην πρώτη στήλη το μέγεθος του αρχείου, στη δεύτερη η ημερομηνία τροποποίησης και στην τρίτη το όνομα του αρχείου. Οι στήλες είναι χωρισμένες με tab. Κατευθύνοντας τώρα την έξοδο της προηγούμενης εντολής στην sort μπορούμε να κάνουμε πολύ ενδιαφέροντα πράγματα:
    % find $FIN |sort -rnk 1|head -n 4

    5146003 2003-08-02-20:45:48     ./Mail/LGU
    2457441 2003-08-01-11:00:07     ./Mail/saved
    2029849 2003-02-04-20:32:24     ./tmp/lp/ss11
    1603828 2003-07-28-22:22:08     ./downl/wg/glib-2.2.2.tar.bz2
Ο διακόπτης '-k NUM' της sort κάνει ταξινόμηση σύμφωνα με το NUM-οστό πεδίο. Εδώ βάλαμε το πρώτο, το μέγεθος δηλαδή. Το 'r' είναι για φθίνουσα ταξινόμηση. Το 'n' είναι για να λάβει η sort υπόψη της ότι πρόκειται για αριθμούς (και να μη βάλει το 11111 πριν από το 11 στη φθίνουσα ταξινόμηση, για παράδειγμα). Χρησιμοποίησα το φίλτρο head για να κρατήσω τις πρώτες 4 γραμμές μόνο (man head). Τι κάναμε δηλαδή; Κάναμε μια αναζήτηση κάτω από τον τρέχοντα κατάλογο και βρήκαμε τα πιο μεγάλα σε μέγεθος αρχεία. Άλλο:
    % find $FIN |sort -rk 2|head -n 4

    20480   2003-08-03-12:32:13     ./tmp/.tips.swp
    7946    2003-08-03-12:32:13     ./tmp/tips
    4096    2003-08-03-12:32:13     ./tmp
    150606  2003-08-03-12:21:35     ./.bash_history
Κάναμε ταξινόμηση ως προς την ημερομηνία και ώρα τροποποίησης. Παρατήρηση: Η find μας επιστρέφει και ονόματα καταλόγων (όπως το ./tmp που φαίνεται πιο πάνω). Για να μην το κάνει αυτό μπορούμε να προσθέσουμε στις παραμέτρους της find το '! -type d'. (man find για περισσότερες πληροφορίες). ### 1.7 Συντόμευση για συνηθισμένα μακριά command lines. Αυτό που κάναμε για την find μπορούμε να το κάνουμε και για άλλες εντολές όταν υπάρχει ένα αρκετά μακρύ command line που πληκτρολογούμε συχνά. Να μπαίνει δηλαδή ένα κομμάτι της εντολής που είναι πάντα σταθερό σε μια μεταβλητή του shell ή αν είναι όλη η εντολή σταθερή να μπαίνει όλη σε ένα alias. Για παράδειγμα, κάθε φορά που διαβάζω ένα ενδιαφέρον ρητό πάω και το προσθέτω σε ένα αρχείο των fortunes. Με τα παρακάτω γλυτώνω πολλή πληκτρολόγηση:
    alias addfort='pushd /usr/local/share/games/fortunes;vi quotes;strfile quotes;popd'
Για το rip ενός dvd:
    alias dvdrip='for i in `seq 1 $n` ; do mplayer -dvd $i -dumpstream -dumpfile ${i}.stream ; done'
Αφού πρώτα θέσουμε τον αριθμό τίτλων του dvd, τους κάνουμε όλους rip με μια εντολή:
    % n=3;dvdrip
Το παραπάνω μπορούσε να γίνει πιο απλά με μια συνάρτηση:
    dvdrip() { for i in `seq 1 $1` ; do mplayer -dvd $i -dumpstream -dumpfile ${i}.stream ; done ;}
οπότε θα χρειαζόταν απλά:
    % dvdrip 3
### 1.8 Διάφορα
    alias h='history '
    alias he='head '
    alias t='tail '
    alias j='jobs -l '
Γλυτώνουμε πληκτρολόγηση...
    alias ejclcd='eject /dev/cdrom;sleep 5s;eject -t /dev/cdrom'
Γιατί να πρέπει να κουραζόμαστε να πατάμε το κουμπί του cd όταν μπορεί να το κάνει το λινουξάκι για μας ;-) ejclcd, βγαίνει το πορτάκι, βάζουμε το δισκάκι, κλείνει μόνο του.
    ssdu() { ls -AQ|xargs du -sb|sort -rn|cut -f 2|awk '{print "\"" $0 "\""}'|xargs du -sh ; }
    ssdus() { while test "$1";do du -sb "$1";shift;done|sort -rn|cut -f 2|awk '{print "\"" $0 "\""}'|xargs du -sh ; }
Να κάτι πιο εξεζητημένο: Η ssdu δείχνει, σε φθίνουσα σειρά, πόσο χώρο χρησιμοποιεί, σε kB/MB/GB, κάθε στοιχείο (αρχείο ή κατάλογος) του τρέχοντος καταλόγου. Και αν θέλετε για συγκεκριμένα αρχεία/καταλόγους μονο, η ssdus παίρνει και ορίσματα. Βασική ιδέα είναι να τρέξει πρώτα η du για να μας δώσει λίστα αρχείων και καταλόγων ταξινομημένων κατά μέγεθος. Στη συνέχεια για κάθε στοιχείο της λίστας, παίρνουμε το όνομα και δείχνουμε μαζί και το μέγεθός του σε kB/MB/GB. Επόμενο Περιεχόμενα