Εργαλεία προγραμματισμού στο Unix

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Σύνδεση με τον υπολογιστή

Απλές εντολές

date Τυπώνει τη μέρα και την ώρα
whoami Τυπώνει το όνομά μας
cal Τυπώνει το ημερολογίου του μήνα
echo hello Τυπώνει hello
echo $HOST Τυπώνει την τιμή της μεταβλητής HOST
finger Τυπώνει τους τρέχοντες χρήστες

Παράδειγμα:

University of the Aegean
Dept of Mathematics
Samos - Greece

*** Network Connection on ttyp0
Local Time: 19:00 on Wednesday, 29 October 1997

This is node athena.math.aegean.gr

UNAUTHORIZED ACCESS PROHIBITED

login: dspin
dspin's Password:
Last login: Wed Oct 29 18:29:10 on ttyp0 from kerkis.math.aeg
No mail.
There are no messages in your incoming mailbox.

athena:~> date
Wed Oct 29 19:01:20 EET 1997

athena:~> whoami
dspin

athena:~> echo hello
hello

athena:~> echo $HOST
athena

athena:~> cal
   October 1999
 S  M Tu  W Th  F  S
                1  2
 3  4  5  6  7  8  9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

athena:~> finger
Login    Name                 Tty  Idle  Login Time   Office     Office Phone
dspin    Diomidis Spinelis     p0        Oct 29 19:00 [ rls105.math.aeg ]
s95138   Antoniou Niki         p1        Oct 29 18:35 [ pyth ]                                                

Το πρόγραμμα βοηθείας

Παράδειγμα:

athena:~> apropos topological
tsort (1)            - Topological sort of a directed graph

athena:~> man tsort 

TSORT(1)                     UNIX Reference Manual                    TSORT(1)

NAME
     tsort - topological sort of a directed graph

SYNOPSIS
     tsort [file]

DESCRIPTION                                           
...

Αρχεία

touch αρχείο Δημιουργεί ένα κενό αρχείο
ls Τυπώνει τα αρχεία ενός καταλόγου
rm Διαγράφει αρχεία
mv Αλλάζει όνομα σε αρχεία
more Τυπώνει αρχεία σελίδα-σελίδα
cat Ενώνει και τυπώνει αρχεία
grep λέξη [αρχείο] Ψάχνει για τη λέξη στο αρχείο

Παράδειγμα:

athena:~/eg> touch myfile
athena:~/eg> ls
myfile
athena:~/eg> rm myfile
athena:~/eg> ls
athena:~/eg> touch one
athena:~/eg> ls
one
athena:~/eg> mv one two
athena:~/eg> ls
two
athena:~/eg> grep Elen /etc/passwd
s95128:XyiD4md/Jk9.E:690:100:Xatzinikolaou Eleni:/home/stud/c95/s95128:/bin/tcsh
s96027:savucWqVCSLHQ:587:100:Gkougkoulia Eleni:/home/stud/c96/s96027:/bin/tcsh
s96035:Qys4Lwmsy.uLI:599:100:Drimtzia Eleni:/home/stud/c96/s96035:/bin/tcsh
s96050:FokFq/a5cJBgs:626:100:Kontaraki Eleni:/home/stud/c96/s96050:/bin/tcsh
s96052:7T6k.D7lzkyK.:631:100:Kote Maria-Elena:/home/stud/c96/s96052:/bin/tcsh
s96138:GhPFvxg0F7W.g:840:100:Pozoukidou Eleni:/home/stud/c96/s96138:/bin/tcsh  

Αλλαγή εισόδου και εξόδου

Σύντομη λίστα εντολών του διορθωτή vi

Προσοχή όταν δίνετε μία εντολή έχει σημασία αν τα γράμματα είναι κεφαλαία ή μικρά.

Ανοίγοντας ένα αρχείο:
vi όνομα

Μετακίνηση μέσα στο αρχείο:
h (ή το αριστερό βελάκι) Μία θέση αριστερά
l (ή το δεξί βελάκι) Μία θέση δεξιά
k (ή το πάνω βελάκι) Μία γραμμή πάνω
j (ή το κάτω βελάκι) Μία γραμμή κάτω
w Στην επόμενη λέξη

Εισαγωγή και διαγραφή κειμένου:
Ο vi έχει δύο καταστάσεις, κατάσταση εντολών και κατάσταση εισαγωγής κειμένου.

Για να μπείτε στην κατάσταση εισαγωγής κειμένου δίνετε:
i Για να μπείτε στην κατάσταση εισαγωγής κειμένου χωρίς να μετακινηθεί ο δρομέας.
a Για να μπείτε στην κατάσταση εισαγωγής κειμένου μετακινούμενοι μία θέση δεξιά.
I Για να μπείτε στην κατάσταση εισαγωγής στην αρχή της γραμμής
A Για να μπείτε στην κατάσταση εισαγωγής στο τέλος της γραμμής

Για να μπείτε στην κατάσταση εντολών δίνετε:
ESC ή ctrl-[

Για να κάνετε αλλαγές στο κείμενό σας:
x διαγράφει τον χαρακτήρα όπου είναι ο δρομέας
dd διαγράφει την γραμμή που είναι ο δρομέας
u ακυρώνει την τελευταία αλλαγή

Αναζήτηση χαρακτήρων/λέξεων μέσα στο κείμενο:
/χαρακτήρες Βρίσκει την επόμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
?χαρακτήρες Βρίσκει την προηγούμενη γραμμή όπου εμφανίζεται το "χαρακτήρες".
n Επαναλαμβάνει την αναζήτηση στις επόμενες γραμμές.

Σώζοντας και βγαίνοντας από ένα αρχείο:
:w Σώζει τις τελευταίες αλλαγές και παραμένει μέσα στο αρχείο.
:x Σώζει τις τελευταίες αλλαγές και βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις αλλαγές

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Ο διορθωτής vi: εντολές ανά κατηγορία

Η εντολές που ακολουθούν είναι χωρισμένες σε κατηγορίες ανάλογα με τη λειτουργία που κάνουν.

Εντολές που σβήνουν ή αντιγράφουν κομμάτια του κειμένου

" Ορίζει ένα ενταμιευτή ο οποίος μπορεί να χρησιμοποιηθεί από όλες τις εντολές που χρησιμοποιούν ενταμιευτές. Αν το " ακολουθείται από ένα γράμμα ή ένα νούμερο τότε αυτό είναι το όνομα του ενταμιευτή.
D Σβήνει από εκεί που βρίσκεται ο δρομέας μέχρι το τέλος της γραμμής
p Αντιγράφει τον ενταμιευτή που του ορίζουμε μετά την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή p χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
P Αντιγράφει τον ενταμιευτή που του ορίζουμε πριν την θέση ή την γραμμή που βρίσκεται ο δρομέας. Αν δεν ορίσουμε κάποιον συγκεκριμένο ενταμιευτή τότε η εντολή P χρησιμοποιεί τον γενικό.(Δείτε το παράδειγμα της εντολής ")
x Σβήνει τον χαρακτήρα πάνω στον οποίο βρίσκεται ο δρομέας. Αν πριν το x δώσουμε ένα αριθμό τότε θα σβηστούν τόσοι χαρακτήρες μετά το δρομέα.
X Σβήνει τον χαρακτήρα που βρίσκεται πριν το δρομέα.
d Σβήνει μέχρι εκεί που του ορίζουμε.Αν δώσουμε dd σβήνει όλη την γραμμή. Ό,τι σβήνεται τοποθετείται στον ενταμιευτή που του ορίζουμε με την εντολή " , αν δεν ορισθεί ενταμιευτής τότε χρησιμοποιείται ο γενικός.
Y Καταχωρεί την γραμμή στον ενταμιευτή που ορίζουμε, αν δεν ορίσουμε ενταμιευτή χρησιμοποιεί τον γενικό.
y Καταχωρεί στον ενταμιευτή που του ορίζουμε (ή στον γενικό) το κομμάτι του κειμένου που του ορίζουμε. Οι κανόνες που ακολουθεί είναι αυτοί που ακολουθεί και η d εκτός από την καταχώρηση μίας γραμμής που γίνεται δίνοντας
yy

Εντολές εισαγωγής κειμένου

A Ξεκινάει την εισαγωγή του κειμένου από το τέλος της γραμμής
I Ξεκινάει την εισαγωγή του κειμένου από την αρχή της γραμμής
o Ξεκινάει την εισαγωγή του κειμένου στην από κάτω γραμμή από αυτή που βρίσκεται ο δρομέας.
O Το κεφαλαίο γράμμα Ο ξεκινάει την εισαγωγή του κειμένου στην από πάνω γραμμή από αυτή που βρίσκεται ο δρομέας.
a Ξεκινάει την εισαγωγή κειμένου μία θέση μετά από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή a με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.
i Ξεκινάει την εισαγωγή κειμένου μία θέση πριν από εκεί που βρίσκεται ο δρομέας. Συνδυάζοντας την εντολή i με έναν αριθμό n πετυχαίνουμε εισαγωγή κειμένου n φορές.

Μετακίνηση του δρομέα μέσα σε ένα αρχείο

^B Πάει πίσω μία σελίδα. Μαζί με ένα νούμερο n γυρνάει n σελίδες πίσω.
^F Πάει μπροστά μία σελίδα. Μαζί με ένα νούμερο n πάει n σελίδες μπροστά.
^D Πάει μπροστά μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα μπροστά
^H Μετακινεί το δρομέα μία θέση αριστερά. Μαζί με ένα νούμερο n πάει n θέσεις δεξιά
^J Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^M Πηγαίνει στον πρώτο χαρακτήρα της επόμενης γραμμής.
^N Ό,τι και το ^J
^P Μετακινεί το δρομέα μία γραμμή κάτω στην ίδια γραμμή. Μαζί με ένα νούμερο n πάει n γραμμές κάτω.
^U Πάει πίσω μισό παράθυρο. Μαζί με ένα νούμερο n πάει n παράθυρα πίσω
$ Μετακινεί το δρομέα στο τέλος της γραμμής. Μαζί με ένα νούμερο n πάει στο τέλος της γραμμής που είναι n γραμμές κάτω από το δρομέα.
% Αν ο δρομέας είναι πάνω σε παρένθεση ή αγκύλη τότε τον μετακινεί σε αυτήν που της ταιριάζει
( Μετακινεί το δρομέα στην αρχή της περιόδου
) Μετακινεί το δρομέα στην αρχή της επόμενης περιόδου
{ Μετακινεί το δρομέα στην αρχή της παραγράφου
} Μετακινεί το δρομέα στην επόμενη παράγραφο
| n| Μετακινει το δρομέα στην στήλη n
+ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της επόμενης γραμμής
- Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της προηγούμενης γραμμής
^ Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα της γραμμής
_ Ό,τι και το ^
0 Ο χαρακτήρας μηδέν μετακινεί το δρομέα στην πρώτη στήλη της γραμμής
B Μετακινεί το δρομέα μία λέξη πίσω
E Μετακινεί το δρομέα μία λέξη μπροστά
nG Μετακινεί το δρομέα στην γραμμή n. Αν δε δώσετε n, τότε πάει στο τέλος του κειμένου.
H Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στην κορυφή της οθόνης
L Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κάτω μέρος της οθόνης
M Μετακινεί το δρομέα στον πρώτο όχι-κενό χαρακτήρα στο κέντρο της οθόνης
W Μετακινεί το δρομέα μία λέξη πίσω
b Μετακινεί το δρομέα μία λέξη πίσω. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο πρώτο της γράμμα
e Μετακινεί το δρομέα μία λέξη μπροστά. Αν ο δρομέας είναι μέσα σε λέξη τότε τον πάει στο τελευταίο της γράμμα
w Ό,τι και το e
h Μετακινεί το δρομέα μία θέση αριστερά
j Μετακινεί το δρομέα μία γραμμή κάτω
k Μετακινεί το δρομέα μία γραμμή πάνω
l Μετακινεί το δρομέα μία θέση δεξιά

Μετακίνηση του δρομέα στην οθόνη

n^E Μετακινεί την οθόνη n γραμμές πάνω, χωρίς να την μετακινεί μία γραμμή.
n^Y Μετακινεί την οθόνη n γραμμές κάτω, χωρίς να την μετακινεί μία γραμμή.
z Αλλάζει την οθόνη ως εξής: z τοποθετεί την γραμμή στην κορυφή της οθόνης. z. τοποθετεί την γραμμή στο κέντρο της οθόνης. z- τοποθετεί την γραμμή στο κάτω μέρος της οθόνης. Αν πριν το z υπάρχει ένα νούμερο n, τότε κάνει αυτές τις αλλαγές για την γραμμή n. Για παράδειγμα 16z τοποθετεί στην κορυφή της οθόνης την γραμμή 16

Αντικατάσταση κειμένου

C Αλλάζει την γραμμή από την θέση του δρομέα μέχρι το τέλος της
R Αλλάζει τόσους χαρακτήρες όσους δίνουμε και αφήνει άθικτους τους υπόλοιπους
S Αλλάζει ολόκληρη την γραμμή
c Αλλάζει την γραμμή μέχρι να βρει μία τελεία. Το cc αλλάζει ολόκληρη την γραμμή
r Αλλάζει τον χαρακτήρα που βρίσκεται ο δρομέας
s Αλλάζει τον χαρακτηρα που είναι ο δρομέας και μπαίνει σε insert mode. Με έναν αριθμό n αλλάζει n χαρακτήρες. Ο τελευταίος χαρακτήρας που είναι να αλλάξει αντικαθίσταται προσωρινά με ένα $

Εντολές για να ψάχνετε μέσα σε ένα κείμενο

/ Ψάχνει προς τα κάτω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το /
? Ψάχνει προς τα επάνω το κείμενο για τη συμβολοσειρά (κανονική έκφραση) που ορίζουμε μετά το ?
n Επαναλαμβάνει την τελευταία εντολή / ή ?
N Ό,τι και το n αλλά στην αντίθετη κατεύθυνση
f Ψάχνει μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
F Ψάχνει προς τα πίσω μέσα στην γραμμή για τον χαρακτήρα που δίνουμε μετά το f και μετακινεί το δρομέα εκεί.
T Ό,τι και το T αλλά πάει το δρομέα στην επόμενη θέση από τον χαρακτήρα.
t Ό,τι και το f αλλά πάει το δρομέα στην προηγούμενη θέση από τον χαρακτήρα
; Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T
, Επαναλαμβάνει την τελευταία εντολή f ή F ή t ή T αλλά στην αντίθετη κατεύθυνση

Εντολές μορφοποίησης χαρακτήρων και γραμμών

~ Αλλάζει από κεφαλαίο σε μικρό και από μικρό σε κεφαλαίο το γράμμα που είναι ο δρομέας
<< Μετακινεί την γραμμή προς τα αριστερά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
>> Μετακινεί την γραμμή προς τα δεξιά. Η τιμή του είναι μεταβλητή και μπορεί να ορισθεί από την set shiftwidth
J Ενώνει την γραμμή που βρίσκεται ο δρομέας με την επόμενη. Με ένα νούμερο n μπροστά ενώνει n γραμμές

Εντολές για να σώσετε και να βγείτε από ένα αρχείο

^\ Μπαίνει σε ΕΧ mode. Ο EX editor είναι αυτός πάνω στον οποίο "χτίστηκε" ο VI. Για να επιστρέψετε σε vi mode δίνετε :vi
Q Ό,τι και η ^\
ZZ Βγαίνει από το αρχείο σώζοντας τις αλλαγές

Μερικές ακόμα εντολές

^G Δείχνει το όνομα του αρχείου τον συνολικό αριθμό γραμμών που έχει και τον αριθμό της γραμμής που βρίσκεται ο δρομέας
^L Καθαρίζει την οθόνη.
^R Ξανασχεδιάζει την οθόνη και διορθώνει τα λάθη
^[ Το σύμβολο <ctrl>-[ είναι ουσιαστικά το <ESC>
! Η εντολή ! ξεκινάει ένα shell. Αμα ορίσετε κάποιες συγκεκριμένες γραμμές τότε χρησιμοποιεί αυτές σαν input και τις αντικαθιστά με το output. Η !! χρησιμοποιεί σαν input την γραμμή που είναι ο δρομέας.
& Επαναλαμβάνει την τελευταία εντολή αλλαγής :s
. Επαναλαμβάνει την τελευταία εντολή
: Δίνει την δυνατότητα να εκτελεστεί μια εντολή του ex.
U Φέρνει την γραμμή που είναι ο δρομέας στην γραμμή που ήταν πριν την αλλάξετε
m "Σημαδεύει" την θέση με τον χαρακτήρα που ακολουθεί το m
u Ακυρώνει την τελευταία αλλαγή. Δύο συνεχόμενα u αφήνουν το αρχείο όπως ήταν πριν από αυτά

Εντολές του EX

Ο vi editor είναι βασισμένος πάνω σε έναν διορθωτή γραμμών, τον ex. Ετσι ο vi δίνει την δυνατότητα να εκτελεστούν οι εντολές του ex.
:ab string strings Κάνει συντομογραφία μιας συμβολοσειράς σε μια άλλη. Ετσι αν δώσετε:
:ab usa United States of America
τότε κάθε φορά που θα γράφετε usa θα εμφανίζεται το
United States of America
:map keys new_seq Με την μέθοδο του mapping μπορείτε να κάνετε συντομογραφίες σε εντολες.
:q Βγαίνει από το αρχείο. Αν έχετε κάνει αλλαγές που δεν έχετε σώσει τότε εμφανίζεται ένα μήνυμα και δεν βγαίνει από το αρχείο
:q! Βγαίνει από το αρχείο χωρίς να σώσει τις τελευταίες αλλαγές
:s/from/to/options Αντικαθιστά την λέξη from στην λέξη to.
:set [all] Ορίζει της μεταβλητές του vi. Η εντολή set all δείχνει όλες τις μεταβλητές και για όσες υπάρχει, την τιμή τους.
:una string κάνει το ανάποδο από την ab, δηλαδή αφαιρεί από μια συμβολοσειρά την ιδιότητά του να είναι συντομογραφία κάποιας άλλης.
:unm keys Το αντίστοιχο του una αλλά για την εντολή map
:vi filename Ξεκινάει την επεξεργασία ενός άλλου αρχείου.
:w Σώζει το αρχείο και παραμένει μέσα σε αυτό
:w new_file Σώζει τα περιεχόμενα του αρχείου σε ένα άλλο με όνομα new_file
:w >> filename Προσθέτει το αρχείο, κάτω από το αρχείο filename
:wq Σώζει τις τελευταίές αλλαγές και βγαίνει από το αρχείο
:x Ότι και το x

Βασισμένο σε κείμενο του Αντώνη Δανάλη <danalis@edu.physics.uch.gr (http://www.edu.physics.uch.gr/~danalis/index3.html)>

Εργαλεία γλωσσικών επεξεργαστών

Το λειτουργικό σύστημα Unix παραδοσιακά περιλαμβάνει πολλά εργαλεία τεχνολογίας γλωσσικών επεξεργαστών. Στο μάθημα αυτό θα χρησιμοποιήσουμε τα παρακάτω εργαλεία:

Χρήση του συμβολομεταφραστή gas

Η χρήση του συμβολομεταφραστή γίνεται μέσω του μεταγλωττιστή της C. Αυτός καλείται με την εντολή gcc:
gcc -o output filename.s
όπου output είναι το εκτελέσιμο αρχείο που θα δημιουργηθεί και filename.s είναι το αρχείο που θα περιέχει τον πηγαίο κώδικα στη συμβολική γλώσσα. Για να εκτελέσουμε το αρχείο, αν ο τρέχων κατάλογος (.) δεν είναι στο μονοπάτι των καταλόγων από τους οποίους εκτελούνται τα προγράμματα πρέπει να προσδιορίσουμε τον τρέχοντα κατάλογο ως τμήμα της εντολής που θέλουμε να εκτελέσουμε:
./mycommand
Έτσι ο κύκλος για την υλοποίηση ενός προγράμματος σε συμβολκή γλώσσα είναι ο παρακάτω:
vi hello.s
gcc -o hello hello.s
./hello
Αν έχουμε κάνει κάποιο λογικό λάθος στο πρόγραμμα θα εμφανιστεί στην οθόνη μας το παρακάτω μήνυμα:
Segmentation fault (core dumped)

Γενική βιβλιογραφία

Ασκήσεις

Συμβολική γλώσσα

  1. Γράψτε ένα πρόγραμμα σε συμβολική γλώσσα Intel 386 σε περιβάλλον Unix το οποίο να τυπώνει τους αριθμούς από το 0 μέχρι το 9.