200 γραμμές
15 KiB
Markdown
200 γραμμές
15 KiB
Markdown
|
+++
|
|||
|
title = 'Απλά μαθήματα Bash μέρος 1ο.'
|
|||
|
date = '1998-10-01T00:00:00Z'
|
|||
|
description = ''
|
|||
|
author = 'Βαγγέλης Παπαδογιαννάκης'
|
|||
|
issue = ['Magaz 08']
|
|||
|
issue_weight = 5
|
|||
|
+++
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
*Γεια και χαρά και καλό Φθινόπωρο. Πάλι ήρθε το μελαγχολικό\...*
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Από αυτή τη στήλη, θα προσπαθούμε να μάθουμε διάφορα κολπάκια για να κάνουμε τη ζωή μας με το αγαπημένο μας λειτουργικό ακόμα καλύτερη (Χμμμ, μάλλον ευκολότερη
|
|||
|
θα ήταν η σωστή λέξη).
|
|||
|
|
|||
|
Αρχίζοντας από αυτό το μήνα, θα παρουσιάσουμε κάποια shell scripts, (σα να λέμε batch files) έτσι ώστε να αυτοματοποιήσουμε κάποιες καθημερινές ενέργειες, και
|
|||
|
να κάνουμε ορισμένες δουλειές γρηγορότερα. Α, δεν έχετε ιδέα από shell scripts ε; Καλά, θα σας τα εξηγήσω όλα\... Ας αρχίσουμε με κάτι απλό\...
|
|||
|
|
|||
|
**ΚΟΛΠΑΚΙ Νο1!!!**
|
|||
|
|
|||
|
Πρώτα από όλα, να γλιτώσουμε χώρο στο δίσκο μας. Αν και με τις σημερινές χωρητικότητες δεν πιστεύω να υπάρχει τέτοιο πρόβλημα, εντούτοις μερικές φορές είναι
|
|||
|
απαραίτητο.
|
|||
|
|
|||
|
Ξέρετε πόσο πολύ χώρο πιάνει το /usr/doc μαζί με τα παρελκόμενά του; Πολύ. Για αυτό θα κάνουμε το εξής: θα συμπιέσουμε το κάθε αρχείο ξεχωριστά με το gzip, και
|
|||
|
θα φτιάξουμε ένα shell script που θα το διαβάζει συμπιεσμένο. Με αυτό τον τρόπο γλιτώνουμε πολύ χώρο στο δίσκο μας.
|
|||
|
|
|||
|
Κατ αρχάς, να τα συμπιέσουμε. Δεν νομίζω να πιστεύατε ότι θα δίδαμε την εντολή gzip για κάθε αρχείο ξεχωριστά! Και για αυτό θα χρησιμοποιήσουμε script (Μετά θα
|
|||
|
σας πω και ένα μυστικό). Γράφουμε λοιπόν:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
#!/bin/bash
|
|||
|
DIR_NAMES=`ls -F|grep /`
|
|||
|
for n in $DIR_NAMES
|
|||
|
do
|
|||
|
echo "compressing $n..."
|
|||
|
cd `pwd`/$n;gzip *;cd ..
|
|||
|
done
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
**ΠΡΟΣΟΧΗ! (2)**: το \` που βλέπετε, είναι η βαρεία (αυτό που είναι μαζί με την περισπωμένη, δίπλα στο πλήκτρο \"1\"\...)
|
|||
|
|
|||
|
1\. Δίδουμε στην μεταβλητή **DIR\_NAMES** την τιμή της εντολής **\"ls -F\|grep /\"**. Δηλαδή, τα αποτελέσματα της **ls** που περιέχουν το σύμβολο / (δηλαδή
|
|||
|
είναι directory)
|
|||
|
|
|||
|
2\. Στη συνέχεια μεταφερόμαστε σε κάθε ένα από τα directoryαυτά, και κάνουμε gzip όλα τα αρχεία (τα συμπιέζουμε δηλαδή).
|
|||
|
|
|||
|
Φυσικά, αυτό θα γίνει για ένα επίπεδο directories.
|
|||
|
|
|||
|
Σώστε το αρχείο με όνομα πχ **zipdir**. Κάντε το εκτελέσιμο με chmod 755 tardir, χώστε το κάπου που να είναι στο path. (πχ **/usr/bin**)
|
|||
|
|
|||
|
Μετακινηθείτε στο **/usr/doc** δίνοντας
|
|||
|
|
|||
|
**cd /usr/doc**
|
|||
|
|
|||
|
και καλέστε το script γράφοντας το όνομα με το οποίο το έχετε σώσει. Για καθένα από τα directories, θα γίνει συμπίεση των περιεχομένων τους.
|
|||
|
|
|||
|
ΚΑΛΟ?
|
|||
|
|
|||
|
(Τώρα θα σας πω το μυστικό. Δεν ήταν ανάγκη να γράψετε το script αυτό, το gzip μπορεί κάνει το ίδιο πράγμα, δίνοντας του την παράμετρο **\--recurcive**.
|
|||
|
Βρισκόμενοι δηλαδή στο **/usr/doc**, θα μπορούσαμε να γράψουμε:
|
|||
|
|
|||
|
**gzip -r \***
|
|||
|
|
|||
|
Και μη με ρωτήσει κανείς γιατί το κάναμε\... Μάθαμε τα εξής, πολύ χρήσιμα, για τα **shell scripts**:
|
|||
|
|
|||
|
1. Για να δώσουμε σε μια μεταβλητή το αποτέλεσμα μιας (ή και περισσότερων εντολών) χρησιμοποιούμε την/τις εντολή/ες ανάμεσα σε βαρείες\...
|
|||
|
2. Μάθαμε την έννοια της **pipe** (\|). Με την pipe, δρομολογούμε την έξοδο της εντολής που είναι αριστερά του pipe στην εντολή που είναι δεξιά του pipe.
|
|||
|
Δίνουμε, δηλαδή, σαν όρισμα στην εντολή grep το αποτέλεσμα της εντολής \"ls -F\". Στη συνέχεια η **grep** το \"φιλτράρει\" και, τελικά, αναθέτουμε στην
|
|||
|
μεταβλητή DIR\_NAMES το αποτέλεσμα\... Απλό ε?
|
|||
|
3. Στο linux, μπορούμε να \"κολλήσουμε\" διάφορα, με αποτέλεσμα το σύνολο να αποτελεί ένα όρισμα. Στην περίπτωσή μας, κολλήσαμε το αποτέλεσμα της pwd (print
|
|||
|
working dir) με τη μεταβλητή n (αυτή που παίρνει τις διάφορες τιμές των directories), και με την cd, μεταφερόμαστε κάθε φορά μέσα και έξω από το κάθε
|
|||
|
subdirectory του **/usr/doc.**
|
|||
|
|
|||
|
Καλά όλα αυτά, αλλά έτσι και χρειαστεί να το διαβάσουμε το άτιμο αυτό το doc του τάδε πακέτου, τι κάνουμε; Να λοιπόν άλλο ένα script:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
#!/bin/bash
|
|||
|
gunzip $1 | less
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Σώστε το αρχείο με όνομα πχ **showdoc**. Κάντε το εκτελέσιμο με **chmod 755 showdoc**, και στη συνέχεια χώστε το κάπου που να είναι στο path. (πχ **/usr/bin**)
|
|||
|
|
|||
|
Για να δείτε ένα gziped doc, γράψτε στο directory του:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
showdoc "όνομα_του_doc_που_θέλετε_να_διαβάσετε"
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Τι μάθαμε εδώ; Πως χρησιμοποιούμε τις παραμέτρους του χρήστη. Αυτό το \$1, λέει στην gunzip να αποσυμπιέσει το αρχείο στο οποίο αναφέρεται η πρώτη λέξη
|
|||
|
(χωριζόμενη με κενά) που γράψατε μετά το κάλεσμα του script. Στη συγκεκριμένη περίπτωση, αφού έχουμε γράψει:
|
|||
|
|
|||
|
**showdoc \"όνομα\_του\_doc\_που\_θέλετε\_να\_διαβάσετε\"**
|
|||
|
|
|||
|
το bash θα ερμηνεύσει το \$1 με το **\"όνομα\_του\_doc\_που\_θέλετε\_να\_διαβάσετε\".**
|
|||
|
|
|||
|
Φυσικά, μπορούμε να ελέγξουμε και τυχόν άλλες εισαγωγές του χρήστη, με τα \$2, \$3, \$4 κ.λπ.
|
|||
|
|
|||
|
Λοιπόν, τελικά να δείτε που δεν χρειάζεται να το κάνετε ούτε αυτό\... Εννοώ να συμπιέσετε τα README. Το πολύ να γλιτώσετε 200 ΚΒ, όσα DOC και να έχετε!!!
|
|||
|
|
|||
|
Μη νομίζετε όμως ότι σας δουλεύω, η μάθηση είναι πολύ πιο εύκολη όταν συνοδεύεται από παραδείγματα!!
|
|||
|
|
|||
|
**ΚΟΛΠΑΚΙ Νο2!!!**
|
|||
|
|
|||
|
Δοκιμάστε να δείτε τι έχετε μέσα στο /usr/bin. \'Αμα έχετε δέκα οθόνες τη μια πάνω από την άλλη (και βρείτε τρόπο να τις συνδέσετε), ίσως και να χωρέσουν τα
|
|||
|
αρχεία που υπάρχουν εκεί μέσα. \'Ελα μου όμως που είσαστε καινούριοι στο Linux, και δεν ξέρετε τι εκτελέσιμα υπάρχουν εκεί\... (μην παρεξηγηθείτε, ούτε οι
|
|||
|
περισσότεροι τα ξέρουν όλα). Πώς θα τα δείτε; ε; Ρωτώ λοιπόν\... Πώς; ε; Πώς;;;
|
|||
|
|
|||
|
Γράψτε στη γραμμή εντολών:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
ls -1 > ti_exo_edo_kai_den_to_ksero
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
Να δείτε ότι θα δημιουργηθεί ένα αρχείο που θα λέγεται \"ti\_exo\_edo\_kai\_den\_to\_ksero\" και θα περιέχει τα αρχεία, όπως αυτά θα προέρχονταν από την ls -1
|
|||
|
(το -1 είναι για να εμφανίσει ένα αρχείο ανά γραμμή).
|
|||
|
|
|||
|
Με το σύμβολο \"\>\" λοιπόν, κάνουμε **επαναδρομολόγηση** της εξόδου (Μα καλά, ώρες-ώρες οι λέξεις αυτές με συναρπάζουν\...). Εκεί που ήταν το αποτέλεσμα της
|
|||
|
**ls -1** να τυπωθεί στην οθόνη, αυτό γράφτηκε στο αρχείο **\"ti\_exo\_edo\_kai\_den\_to\_ksero\".**
|
|||
|
|
|||
|
Θα μου πείτε \"σιγά μωρέ, αυτο το κάνω και με τη **less** ή τη **e**\...\". Έχετε δίκιο λοιπόν, και για αυτό το λόγo θα σας δώσω μερικά πιο καλά
|
|||
|
παραδείγματα\...
|
|||
|
|
|||
|
**Redirect output** (έτσι λέγεται αυτό το επαναδρομολόγηση της εξόδου) μπορούμε να κάνουμε ακόμα και σε συσκευές του συστήματός μας. Πχ, η εντολή:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
echo "Look at your printer" > /dev/lp1
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
θα στείλει στην lp1 (αυτό είναι, συνήθως, ο printer σας) το \"**Look at your printer\".**
|
|||
|
|
|||
|
Αντίστοιχα, η εντολή
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
cat README > lp1
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
θα στείλει στον Printer σας το αρχείο README (φροντίστε να είναι σε μορφή ASCII).
|
|||
|
|
|||
|
Για όλα αυτά τα ωραία, πρέπει:
|
|||
|
|
|||
|
1. Nα υπάρχει εκτυπωτής
|
|||
|
2. Να είναι αναμμένος
|
|||
|
3. Να είναι συνδεμένος στο PC
|
|||
|
4. Να είναι ONLINE
|
|||
|
5. Να έχει χαρτί
|
|||
|
6. Να έχει μελάνι (αν είναι inkjet), toner (αν είναι laser), μελανοταινία (αν είναι dot-matrix)
|
|||
|
7. Να μην είναι χαλασμένος.
|
|||
|
|
|||
|
Αν δεν έχετε εκτυπωτή, μάλλον δε θα μπορέσετε να τυπώσετε, άρα μην το κάνετε. Για εσάς έχω άλλο κολπάκι\...
|
|||
|
|
|||
|
**ΚΟΛΠΑΚΙ ΓΙΑ ΟΣΟΥΣ ΔΕΝ ΕΧΟΥΝ ΕΚΤΥΠΩΤΗ:**
|
|||
|
|
|||
|
\'Οσοι από εσάς δεν έχουν εκτυπωτή, έχουν Μodem, διαφορετικά πως βλέπετε αυτές τις αράδες; Ε; (\'Εκτός φυσικά αν σας τα έφεραν τυπωμένα. Σε αυτή την περίπτωση
|
|||
|
χρησιμοποιήστε των εκτυπωτή που τα τύπωσε για το προηγούμενο κολπάκι)
|
|||
|
|
|||
|
Αφού μετά από όριμη σκέψη ανακαλύψαμε ότι έχετε Modem, γράψτε:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
echo "ATX3DT090835398" > /dev/ttyS2
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
(ttyS0=com1, ttyS1=com2, ttyS3=com3 κ.ο.κ. ανάλογα που είναι το modem σας).
|
|||
|
|
|||
|
Ο υπολογιστής σας θα καλέσει τον αριθμό 090835398 (αν υπάρχει), και θα μιλάει για σας με το μέντιουμ που βρίσκεται σε αυτή την HotLine
|
|||
|
|
|||
|
(Σε αυτό το σημείο να αναφέρω ότι ο συντάκτης, αλλά και ο εκδότης του παρόντος, δεν αναλαμβάνουν οποιαδήποτε ευθύνη για κακή χρήση του κόλπου αυτού, με λίγα
|
|||
|
λόγια δηλαδή δεν πληρώνουμε εμείς τον λογαριασμό του ΟΤΕ σας).
|
|||
|
|
|||
|
Καλύτερα λοιπόν να βάλετε ένα αστικό νούμερο. Αν το δοκιμάσετε, το Modem σας θα καλέσει αυτό τον αριθμό.
|
|||
|
|
|||
|
Για να κλείσετε τη γραμμή δώστε:
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
echo "ATΗ" > /dev/ttyS2
|
|||
|
|
|||
|
----------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|||
|
|
|||
|
(ttyS0=com1, ttyS1=com2, ttyS3=com3 κ.ο.κ. ανάλογα που είναι το modem σας).
|
|||
|
|
|||
|
Η γραμμή θα κλείσει.
|
|||
|
|
|||
|
Αυτά τα ολίγα προς το παρόν\... Τον επόμενο μήνα θα έχουμε πιο προχωρημένα πράγματα\...
|