Ο visual editor vi 1 Θα δηµιουργήσουµε ένα αρχείο µε όνοµα «pass» που θα έχει 12 γραµµές vassik@aetos:~/xunix/lab4$ tail -12 /etc/passwd >pass (δηλ. τις 12 τελευταίες γραµµές από το αρχείο /etc/passwd και τις βάζουµε στο αρχείο pass) O vi ξεκινά σε κατάσταση «command mode» (δηλ δίνουµε εντολές δεν εισάγουµε κείµενο) 1. Eίσοδος & έξοδος από τον vi $ vi pass Κλήση του vi για το αρχείο pass Εµφανίζεται στην οθόνη το κοµµάτι του αρχείου που επιθυµούµε να δούµε και να αλλάξουµε Aρχείο «pass 12 γραµµές 962 χαρακτήρες Κέρσορας στο 1,1 :q Έξοδος από το vi µε :q (uit) κέρσορας 2. ιαγραφή γραµµών & σώσιµο $ vi pass Για να σβήστε π.χ. την 1 η γραµµή (εκεί που είναι ο κέρσορας) πατήστε dd Για να σβήστε π.χ. ακόµα 5 γραµµές 5dd (..και µας έµειναν 6 γραµµές) :wq Έξοδος και σώσιµο µε :w(rite)και :q (uit) Όταν ξεκινάει ο vi βρίσκεται σε κατάσταση «command mode» δηλαδή δέχεται εντολές: dd (delete) σβύνεται η τρέχουσα γραµµή 5dd σβύνονται 5 γραµµές από το κέρσορα (..αλλά και όσες δοθούν ) yy (yank)αντιγράφεται (copy) στο buffer η τρέχουσα γραµµή (από το κέρσορα) p (paste) επικόλληση της γραµµής 3. Αντιγραφή τρέχουσας γραµµής & έξοδος χωρίς σώσιµο $ vi +5 pass 1 Υπάρχει και βελτιωµένη έκδοση ο vim [1]
κέρσορας Για να κάνετε copy π.χ. την 5 η γραµµή (εκεί που είναι ο κέρσορας) πατήστε yy και p κέρσορας στο 5 :q! Έξοδος χωρίς σώσιµο µε q (uit)! (δίνω q! αν έχω κάνει αλλαγέs και δεν έχω σώσει) Υπάρχουν βέβαια πολλές άλλες εντολές π.χ. Kίνηση µέσα στον vi u (undo) ακύρωση της προηγούµενης εντολής ^ αρχή γραµµής d (redo) επανάληψη της προηγούµενης εντολής $ τέλος γραµµής dw σβύνεται η τρέχουσα λέξη (word) G τελευταία γραµµή 5dw σβύνονται 5 λέξεις από το κέρσορα (..αλλά και όσες δοθούν ) 5G 5 η γραµµή.. yw αντιγράφεται (copy) στο buffer η τρέχουσα λέξη (από το κέρσορα) x σβύνεται o τρέχοv χαρακτήρας ΖΖ έξοδος Προσοχή δεν είναι ίδια κεφαλαία και µικρά Σηµαντικές είναι οι εντολές που έχουν µπροστά : µε / : Όταν δοθεί πάνω κάτω τελεία ο vi περιµένει να δώσουµε µια εντολή (command line) Οι πιο συνήθεις εντολές που δίνουµε έχουν σχέση µε search/replace, έξοδο και σώσιµο ή όχι των αλλαγών µας όπως π.χ. :q έξοδος χωρίς σώσιµο - αν δεν έχουµε κάνει αλλαγές :q! έξοδος χωρίς σώσιµο - αν έχουµε κάνει αλλαγές :w σώσιµο των αλλαγών :wq σώσιµο των αλλαγών και έξοδος :x σώσιµο και έξοδος / Όταν δοθεί / ο vi περιµένει να δώσουµε ένα pattern για να το ψάξει στο κείµενο π.χ. /Pan και µε n (ext) πηγαίνει στο επόµενο και Ν στο προηγούµενο pattern O vi σε κατάσταση ««insert mode» (δηλ για να εισάγουµε/τροποποιήσουµε το κείµενο) i Όταν δοθεί i, εισαγωγή πριν το κέρσορα, o vi µπαίνει σε κατάσταση «insert mode» και µπορούµε να τροποποιήσουµε το κείµενο εισάγοντας ότι επί πλέον θέλουµε, καθώς και µε I εισαγωγή στην αρχή της τρέχουσας γραµµής a εισαγωγή µετά το κέρσορα A εισαγωγή στο τέλος της τρέχουσας γραµµής Χρησιµοποιούµε ESC για να αλλαγή mode. [2]
Εστω ότι θέλω να δηµιουργήσω ένα αρχείο που περιέχει 2 γραµµές π.χ. τις 2 εντολές. ls /*/*/staff ls -l /*/*/*/*/dstai*/wo* 1.Μπορώ ναχω δυο shell ανοιχτά, στο 1 ο έχω vi σε Insert mode, στο 2 ο δοκιµάζω την εντολή και την αντιγράφω στο 1 ο µέσα στο vi 2. Bάζω στις εντολές echo, µονά εισ/κά ' και > ls /*/*/staff => echo 'ls /*/*/staff' >out #create ls -l /*/*/*/*/dstai*/wo* => echo 'ls -l /*/*/*/*/dstai*/wo*' >>out #append Αν θέλω να τις αποθηκεύσω σε αρχείο µε όνοµα out θα βάλω µπροστά τους το echo και θα τις περικλείσω µε ' και στο τέλος της 1 ης >out, στο δε τέλος της 2 ης >>out 3. Με την εντολή cat και αντιγράφοντας τις εντολές cat >out # δηµιουργία αρχείου µε όνοµα out <εντολέs> # αντιγράφω τις εντολές ^D # στο τέλος, πατώ Ctrl + D Ασκησούλες (για το σπίτι) Στην 1 η άσκηση του 3 ου εργαστήριου δηµιουργήσατε 11 αρχεία µε ονόµατα: hello.dat Hello.dat hello.doc hello10.exe hello12.c hello1.exe hello2.exe helloa.exe helloaexe hello.exe Hello.exe που έχουν την παρακάτω σειρά 11 αρχεία Πόσα αρχεία θα εµφανίσουν οι εντολές (απαντήστε χωρίς να τις τρέξετε): $ ls * $ ls *. $ ls *.* $ ls *exe $ ls *.exe $ ls *c $ ls h* $ ls H*. $ ls H* $ ls H*exe $ ls h*exe $ ls *1* $ ls? $ ls *.? $ ls *d?* $ ls *o??? $ ls *o???? $ ls *e? $ ls [hh]* $ ls *[12]* $ ls *[12] $ ls *[013]* $ ls *[tfc]* $ ls *[tfc] Λύση 11,,10,7,6,2 9,,2,1,7,3,1,3,,7,7 11,4,,3,4,4,4 Ελέγξτε µε εντολή πόσα αρχεία έχετε. Αλλάξτε το σύνολο των χαρακτήρων σε ΑSCII και επαναλάβετε την άσκηση. Αφού τελειώστε γυρίστε στο ISO8859-7. Μεταφερθείτε στο home directory σας και κατόπιν µε µια εντολή σβήστε όλα όσα υπάρχουν στο directory tests ζητώντας επιβεβαίωση διαγραφής. Άσκηση Να δηµιουργήσετε µε vi ένα script που δείχνει την ώρα και την ηµεροµηνία, απαριθµεί όλους τους συνδεδεµένους χρήστες και δίνει το χρόνο λειτουργίας του συστήµατος. Το σενάριο στη συνέχεια θα αποθηκεύει αυτές τις πληροφορίες σε ένα αρχείο καταγραφής µε όνοµα logfile. Να το κάνετε εκτελέσιµο και να το τρέξετε. (Hint: δείτε στο man, format της εντολής date π.χ. date +%Y καθώς και την εντολή uptime). [3]
ηµιουργία ενός καλού script http://tldp.org/ldp/abs/html/unofficialst.html Ένα καλό σενάριο/script πρέπει να εκτελεί το έργο που προορίζεται χωρίς σφάλµατα, να µην κάνει περιττές εργασίες και να είναι επαναχρησιµοποιήσιµο. 1. Βάλτε Σχόλια στο κώδικα, έτσι είναι κατανοητός και διορθώνεται πιο εύκολα. PASS="$PASS${MATRIX:$(($RANDOM%${#MATRIX})):1}" #οxxx den ksero ti kanei? 2. Προσθέστε επικεφαλίδες ( π.χ. 1 η γραµµή & στοιχεία σας) #!/bin/bash #************************************************# # script1.sh # # written by Bozo Bobo # # March 09, 2016 # # # # A preliminary script # #************************************************# 3. Xρησιµοποιήστε µεταβλητές και χαρακτηριστικά ονόµατα µεταβλητών π.χ. αντί ορίστε την LOGFILE if [ -f /var/log/messages ] then fi 4. Xρησιµοποιήστε exit codes µε συστηµατικό τρόπο π.χ. #αν αλλάξει, αλλάζετε µόνο µια γραµµή. LOGFILE=/var/log/messages if [ -f "$LOGFILE" ] then fi E_WRONG_ARGS=95 exit $E_WRONG_ARGS Κάθε σενάριο επιστρέφει ένα exit code, που είναι το exit code της τελευταίας του εντολής. Ανάλογα µε τον αριθµό αυτό (0-255) κρίνεται και η κατάσταση εξόδου του script π.χ. exit 0: αν όλα ΟΚ, exit 1: µικρά λαθάκια exit 2: σοβαρά λάθη 5. Xρησιµοποιήστε στανταρντ γράµµατα για flags/options π.χ. -a:all, -h: Help [4]
. Μια ακόµη χρήση του cat Concatenate files / Ένωµα αρχείων Here document 1. $ cat file 1 εµφανίζει το αρχείο (το περιεχόµενο), που δέχεται σαν όρισµα (file 1 ). 2. $ cat file 1 file 2 file 3 εµφανίζει στην οθόνη τα αρχεία file 1 file 2 file 3, το ένα µετά το άλλο (τα ενώνει). 3. $ cat vlepo oti grafo vlepo oti grafo ^D χωρίς όρισµα, µου ξαναδείχνει στην οθόνη ότι πληκτρολογώ, δηλ. αντιγράφει την standard είσοδο (πληκτρολόγιο), στην standard έξοδο(οθόνη). Σταµατώ µε Ctlr+D. 4. $ cat >neoarxeio mporw etsi na dimiourgiso ena mikro arxeio sta grigora ^D δηµιουργείται ένα νέο αρχείο µε όνοµα neoarxeio, που περιέχει τις γραµµές που πληκτρολογήθηκαν. To τέλος του αρχείου σηµαδοτείται µε Ctlr+D. 5. Ηere document (4 η εργασία /1 η άσκηση) Εστω ένα αρχείο µε όνοµα pagefile, που έχει πολλαπλές εντολές echo π.χ. echo "<HTML>" echo "<HEAD>" # echo. echo "</HEAD>" echo "</HTML>" Aν το καταστήσουµε εκτελέσιµο π.χ. chmod 755 pagefile και το τρέξουµε µε : pagefile >pagefile.html θα δηµιουργηθεί ένα νέο html αρχείο µε όνοµα pagefile.html µε τις html εντολές. Αντί όµως από τα συνεχόµενα echo (κουραστικά!), θα χρησιµοποιήσουµε το cat << σε ένα here document script µπλοκ. Το here document χρησιµοποιεί µια µορφή I/O ανακατεύθυνσης για να τροφοδοτήσει, µια εντολή ή ένα πρόγραµµα (όπως το ftp, cat,ex text editor), µε µια λίστα εντολών. Ένα here script συντάσσεται: command << token <περιεχόµενο που θα είναι το standard input της command> token Εστω το παρακάτω (εκτελέσιµο) αρχείο µε όνοµα makepage #! /bin/bash # scriptfilename : makepage ΤITLE="My page.." cat << telos <HTML> <HEAD> <TITLE> #Eδώ τίτλος $TITLE </TITLE> </HEAD> <BODY> #Εδώ περιεχόµενα σελίδας </BODY> </HTML> telos Mπορούµε να το τρέξουµε µε./makepage και να δηµιουργήσουµε το αρχείο µε την σελίδα µας πχ./makepage > index.html [5]