Skip to content

Instantly share code, notes, and snippets.

@jtsagata
Last active March 8, 2022 14:02
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jtsagata/b3a18b330fc50e12d155f3687a5ac63e to your computer and use it in GitHub Desktop.
Save jtsagata/b3a18b330fc50e12d155f3687a5ac63e to your computer and use it in GitHub Desktop.
Μαθήματα Bash: Προσδοκίες και expect

Μαθήματα Bash: Προσδοκίες και expect

Στην συνέχεια της σειράς μαθημάτων για το Bash Scripting σήμερα θα δούμε για την εντολή expect. Το πρώτο μέρος της σειράς πήρε καλές κριτικές. Μένει να δούμε αν το παρόν πόνημα θα δικαιώσει τις προσδοκίες του δύσκολου κοινού. Εφοδιαζόμαστε και καφέ καθαρό κεφάλι και είμαστε έτοιμοι

Προετοιμασία

Επειδή το πάν είναι η καλή οργάνωση, ας οργανωθούμε πρώτα λίγο. Επειδή στην πορεία θα φτιάξουμε πολλές εντολές, καλό είναι αυτές να τις έχουμε σε ένα φάκελο. Εμένα που αρέσει να τις έχω στον φάκελο ~/.local/bin.

Και γιατί βρε αδελφάκι, δεν τις βάζεις σε ένα φάκελο που να έχει το όνομα "εντολές"; Ελληνικά δεν ξέρεις; Και τέλος πάντων τι είναι αυτές οι καλικατσούνες "." και "~";

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

Υπάρχουν κάποιες συμβάσεις για την οργάνωση του συστήματος αρχείων που εξηγούν την δομή του, τα ονόματα των φακέλων, καθώς και που μπαίνει τι. Εκεί μέσα εξηγεί τι σημαίνει local και bin και τι μπαίνει εκεί μέσα. Και αυτές τις συμβάσεις ακολουθώ. Στους υπολογιστές οι συμβάσεις είναι καλό πράγμα. Τώρα άμα δεν σου αρέσουν κάνε το κατά πως θες, (Ξά σου, όπως λέμε και στην Κρήτη). Δικό σου το μηχάνημα δική σου και η εξουσία (ξα). Αυτό είναι και το νόημα της ελευθερίας. Υπάρχουν διανομές που δεν ακολουθούν αυτές τις συμβάσεις και έχουν τους λόγους τους. Αλλά δεν θα κάνεις καλά άμα θες τις γνώμη μου.

Και γιατί δηλαδή ".local" και όχι σκέτο "local"; Την καλικατσούνα τι την θες;

Θα σου πω ένα καλά κρυμμένο μυστικό. Αν ενός αρχείου ή φάκελου ξεκινά το όνομα του με ., τότε θα είναι καλά κρυμμένο και δεν θα το βλέπεις. Θα είναι ένα καλά κρυμμένο μυστικό! Και εγώ θέλω να βλέπω τα σημαντικά μόνο όταν κοιτάζω τι έχει μέσα ένας φάκελος. Εδώ θα σε καταλάβω αν εσύ δεν θέλεις να είναι κρυμμένο. Αλλά θα σου πω ένα άλλο καλά κρυμμένο μυστικό. Έχεις ήδη αυτόν το κατάλογο στην περιοχή σου, αλλά δεν το ήξερες γιατί ήταν καλά κρυμμένος (και αν το ήξερες δεν θα ρώταγες). Όσο για τις καλικατσούνες, θα δούμε πολλές τέτοιες στην συνέχεια. Συνήθισε το.

Για δοκίμασε τώρα από το πρόγραμμα με το οποίο βλέπεις να αρχεία σου (nemo, nautilus, caja, κλπ) να δεις αν έχει τρόπο για να δεις τα κρυφά αρχεία και φακέλους. Τα κατάφερες; Από το τερματικό μπορείς να τα δεις με την εντολή

$ ls -a

Είτε υπάρχει, είτε δεν υπάρχει, ο φάκελος, εγώ μια φορά θα τον φτιάξω. Και θα βάλω ένα άλλο φάκελο με τον όνομα bin. Μια από τις παρακάτω εντολές θα το κάνει αυτό. Ποια πιστεύεις πως είναι η σωστή;

$ mkdir --parents ~/.local/bin
$ mkdir -p ~/.local/bin

Σας κορόιδεψα, γιατί είναι ακριβώς ή ίδια εντολή. Η πρώτη περίπτωση εξηγεί καλύτερα τι κάνει και επίσης σου επιτρέπει να κάνεις ορθογραφικά λάθη. Πολλές εντολές έχουν σημαίες (flags) που μπορούμε να τις γράψουμε είτε ολόκληρες με "--" είτε με ένα γράμμα μόνο με "-" Τι κάνει η εντολή mkdir; Η εντολή mkdir φτιάχνει φακέλλους (folders) ή αλίως καταλόγους (directories), αυτό κάνει. Αν μιλάμε για την γραμμή εντολών (cli) τους φακέλους τους λέμε καταλόγους, ενώ αν μιλάμε για το γραφικό περιβάλλον τους καταλόγους τους λέμε φακέλους. Μάλλον προσπαθώ να πως ότι είναι το ίδιο πράγμα, και δεν έχει σημασία πως τους λέμε, αρκεί να τους ονομάζουμε σωστά. ".local" και όχι σκέτο "local", εντάξει;

Ένας καινούργιος χρήστης συνήθως θα γράψει

$ mkdir .local
$ cd .local
$ mkdir bin

εκεί ήμουν μια φορά και ξέρω.

Το σύστημα βοήθειας

Μέχρι που σκέφτηκα να γράψω man mkdir και βρήκα την σημαία "--parents" που φτιάχνει όλη την διαδρομή είτε υπάρχουν κάποιοι φάκελοι είτε όχι. Καλό είναι όταν μαθαίνουμε μια καινούργια εντολή να την τρέχουμε για να μαθαίνουμε τι κάνει, ή τι παραπάνω μπορεί να κάνει. Και μόλις μάθαμε μια καινούργια εντολή. Ευθύς λοιπόν θα γράψουμε

$ man man

για να βρούμε τι κάνει. Και όπως θα σου πει και ένας παλιός, αυτή είναι η μόνη εντολή που χρειάζεται να ξέρεις. Αλήθεια και υπήρχε μια εποχή που αυτή ήταν η μόνη πηγή πληροφόρησης και θεωρούνταν και εξαιρετική. Βέβαια οι παλιοί χρήστες του UNIX ήταν αντιπαθητικοί και δεν τους καλούσαν ποτέ στα πάρτι. Οι καινούργιοι, ειδικά μετά το Ubuntu που έφτιαξε ωραίες κοινότητες, δεν είναι, αλλά πάλι δεν τους καλούνε, για κάποιο λόγο. Και είναι κρίμα γιατί έτσι δεν θα μάθουν οι διασκεδάζοντες την εντολή

$ yelp man:man

Αν συνεχίσεις την ανάγνωση θα βρεις ένα τρόπο να το κάνεις αυτό αυτόματα.

Ο κατάλογος του χρήστη

Μισό. Τι είναι αυτό το "~". Πάλι καλικατσούνες;

Τις καλικατσούνες πρέπει να τις συνηθίσουμε και γιατί όχι να αρχίσουμε να τις αγαπάμε. Αυτή είναι μια συντομογραφία του καταλόγου χρήστη. Είναι αυτό που λέμε "σπίτι μου σπιτάκι μου". Τα πάντα εδώ μέσα είναι δικά μου και τα κάνω ότι θέλω. Συχνά δεν τους κάνω και πράγματα που δεν θέλω, οπότε κρατάμε και κανένα αντίγραφο ασφαλείας (backup). Έτσι; Και μπορώ να έχω στον ίδιο υπολογιστή πολλούς χρήστες καθένας με την δική του περιοχή και σελιδοδείκτες στον firefox. Και δεν μπορεί να πειράξει ο ένας τον άλλο.

Στο μηχάνημα μου, θα μπορούσα επίσης να είχα γράψει το μακρινάρι:

$ mkdir -p /home/talos/.local/bin

αλλά θα είχε νόημα αυτό μόνο στο μηχάνημα μου. Και στα μηχανήματα όλων των χρηστών, που τυχαίνει να έχουν ένα χρήστη με όνομα talos. Αλλά επειδή μάλλον έχεις ένα διαφορετικό όνομα χρήστη, οι παρακάτω εντολές θα δουλέψουν καλύτερα

$ mkdir -p ~/.local/bin
$ mkdir -p $ΗΟΜΕ/.local/bin
$ mkdir -p ${ΗΟΜΕ}/.local/bin

Και τι είναι τα $ΗΟΜΕ, ${ΗΟΜΕ}, ~; Θα σε προλάβω πριν ρωτήσεις. Είναι ψευδώνυμα (alias) για τον κατάλογο του χρήστη. Και έτσι θα δουλέψουν για κάθε χρήστη. Έξυπνο; Εσύ ποιο θα διαλέξεις; Εγώ στην γραμμή εντολών θα κοιτάξω να γράψω όσο το δυνατόν λιγότερα. Αλλά αν φτιάχνω κάποια καινούργια εντολή θα προτιμήσω να είμαι πολύ αναλυτικός.

Μεταβλητές και περιβάλλον

Τελειώσαμε με τις ερωτήσεις λοιπόν. Πάμε παρακάτω; Τι; Από που έρχεται η τιμή του ${ΗΟΜΕ} και τι είναι; Με ένα μαγικό τρόπο παίρνει τιμή από ένα αρχείο του συστήματος. Αυτό είναι ένα απλό αρχείο κειμένου και μπορείς το δεις με την εντολή

$ cat /etc/passwd

Το ${ΗΟΜΕ} είναι αυτό που λέμε μια μεταβλητή περιβάλλοντος. Θυμάσαι που στο προηγούμενο μάθημα έφταιξες κάποιες μεταβλητές όπως την ${videolist}; Κάτι τέτοιο είναι, αλλά με μια σημαντική διαφορά. Μια μεταβλητή σαν την ${videolist} υπάρχει μόνο μέσα στο σενάριο που γράψαμε (ή σε μια συνεδρία του κελύφους). Αλλά μια μεταβλητή περιβάλλοντος υπάρχει παντού. Το παρακάτω σενάριο θα μας βοηθήσει να καταλάβουμε τις διαφορές τους.

#!/bin/bash
HOME=lala
song=trialala

echo "H τιμή της μεταβλητής HOME είναι ${HOME}"
echo "H τιμή της μεταβλητής song είναι ${song}"
echo "H τιμή της μεταβλητής ding είναι ${ding}"

Κατά σύμβαση γράφουμε τις μεταβλητές περιβάλλοντος με ΚΕΦΑΛΑΙΑ γράμματα. Γράψε το πρόγραμμα και τρέξε το. Καμία έκπληξη. Τώρα δώσε στο κέλυφος τις εντολές

$ echo "H τιμή της μεταβλητής HOME είναι ${HOME}"
$ echo "H τιμή της μεταβλητής song είναι ${song}"

ή αν βαριεσαι να γράφεις πολλά

$ echo $HOME
$ echo $song

Τι παρατηρείς; Αν πριν τρέξω την εντολή είχα δώσει την εντολή song=tamtiriri θα αλλάξει η τιμή της μεταβλητής αν ξανατρέξω το πρόγραμμα; Μπορεί να πάρει με κάποιο τρόπο απ'έξω τιμή η μεταβλητή ${ding}; Πάρε τον χρόνο σου και κάνε τα πειράματα σου. Αν δεν το κατάλαβες τώρα, μην αφήσεις να σε στενοχωρήσει αυτό.

Πόσες άλλες μεταβλητές περιβάλλοντος υπάρχουν και πως τις βλέπουμε;

Α αυτό είναι εύκολο. Δώσε την εντολή

$ export

και θα δείς κάτι σαν το παρακάτω

declare -x DESKTOP_SESSION="cinnamon"
declare -x DISPLAY=":0"
declare -x HOME="/home/talos"
declare -x LANG="el_GR.UTF-8"
declare -x USER="talos"

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

$ LANG=en gimp

αν θέλουμε μπορούμε να φτιάξουμε την δικιά μας εντολή english_gimp να το κάνει αυτό, και ξέρουμε ήδη πως.

#!/bin/bash
export LANG=en
gimp

Μένει τι είναι και τι κάνει αυτό το declare; Ξέρουμε να το βρούμε μόνοι μας αυτό. Θα δώσουμε την εντολή που μόλις μάθαμε

$ man declare

και θα αποτύχουμε γιατί η εντολή αυτή είναι εσωτερική εντολή του κελύφους bash και η σωστή εντολή για να δούμε την βοήθεια της είναι

$ help -m declare

Γιατί αυτό το μπλέξιμο; Γιατί υπάρχει μια διαφορά ανάμεσα στις εσωτερικές εντολές του κελύφους και στις εξωτερικές. Μπορώ να δω αν μια εντολή είναι εσωτερική εξωτερική με την εντολή type

$ type declare
$ type man

Είναι η εντολή type μια εσωτερική ή μια εξωτερική εντολή; Πώς θα το βρω αυτό;

Η εντολή declare -x σημειώνει την μεταβλητή για εξαγωγή. Δεν έχω βρεθεί ποτέ στην ανάγκη να χρησιμοποιήσω αυτή την εντολή και ο συνήθης τρόπος για να το κάνεις αυτό είναι με την εντολή export. Μπορείς να βρεις και να διαβάσεις την βοήθεια της και να δεις τι κάνει;

Δέντρα

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

$ apt install tree
$ man tree
$ tree -Hd $HOME -o delete-me.html
$ xdg-open delete-me.html
$ gvfs-trash delete-me.html

Η εντολή xdg-open είναι ισοδύναμη με το να κάνεις διπλό κλικ για να ανοίξει ένα αρχείο και η εντολή gvfs-trash στέλνει ένα αρχείο στο καλάθι των σκουπιδιών, και απο όπου μπορεί να ανακτηθεί αν γίνει λάθος. Πάντα έβρισκα την εντολή rm λίγο δραματική ...

Υπάρχουν όμως και άλλα τέτοια δέντρα μέσα στον υπολογιστή. Τα δέντρα των προγραμμάτων (ή διεργασιών αν θες να το παίξεις ξερόλας αν ποτέ σε καλέσουν σε ένα πάρτι). Όταν ξεκινάει ο υπολογιστής τρέχει αρχικά ένα μόνο πρόγραμμα το λεγόμενο init και αυτό με την σειρά του τρέχει όλα τα άλλα προγράμματα και υπηρεσίες . Υπάρχουν πολλά διαφορετικά init, αλλά το init που έχει η μοντέρνα διανομή σου είναι συνήθως αυτό που το λένε systemd για το οποίο είμαι σίγουρος ότι έχεις ακούσει τα καλύτερα λόγια. Ας δούμε το δέντρο των προγραμμάτων με την εντολή

$ pstree

Αν ακολουθήσεις το δέντρο θα βρεις μια διαδρομή που να συνδέει το τερματικό σου που τρέχει το bash με το systemd. Την βλέπεις; Αν όχι δεν πειράζει. Το σύστημα τρέχει πολλές διεργασίες που συνεργάζονται μεταξύ τους -- αρμονικά συνήθως -- για να σου εξασφαλίσουν την εμπειρία χρήσης που έχεις.

Γιατί τα λέω αυτά; Γιατί το δέντρο των διεργασιών είναι και το δέντρο των μεταβλητών περιβάλλοντος. Μια μεταβλητή που υπάρχει σε ένα κλαδί θα υπάρχει και σε όλα τους υποκλάδους και τα φύλλα του. Μπορούμε να τις αλλάξουμε την τιμή, ή να φτιάξουμε καινούργιες, κάπου και αυτό θα επηρεάσει προς τα κάτω τα καινούργια προγράμματα. Η αλλαγή δεν θα κινηθεί ποτέ ανάποδα στην ροή. Έτσι δεν μπορούμε από το κέλυφος μας να πειράξουμε το περιβάλλον του systemd, και αυτό είναι για καλό. Δηλαδή δεν έχουμε μόνο μια "αποθήκη" μεταβλητών περιβάλλοντος, αλλά μια ιεραρχία από αποθήκες. Αν το καταλάβεις αυτό έχεις καταλάβει πολλά πράγματα, αρκετά από αυτά όμως δεν έχεις καταλάβει ακόμα ότι τα κατάλαβες.

Άρα αν εξάγω μια μεταβλητή στο περιβάλλον θα επηρεάσει όλα όσα θα τρέξω στην συνέχεια;

Αν την τρέξεις στο ίδιο τερματικό ναι. Αν την τρέξεις σε ένα τερματικό που το ξεκίνησες απο αυτό το τερματικό ναι. Αν την τρέξεις από ένα άλλο τερματικό όχι. Θυμήσου το δέντρο με τα κλαδιά και που είσαι στην κάθε περίπτωση. Υπάρχει ένα απλό κόλπο για να επιστρέψει το τερματικό σε μια αρχική κατάσταση.

$ env -i bash

Η μεταβλητή περιβάλλοντος $PATH

Ας κάνουμε μια ανακεφαλαίωση. Τι καταφέραμε να κάνουμε μέχρι στιγμής; Φτιάξαμε ένα κατάλογο για να βάζουμε μέσα τις εντολές που ΘΑ φτιάξουμε. Στην πορεία μάθαμε μερικά επιπλέον πράγματα, για το πως είναι ένα σύγχρονο σύστημα UNIX. Υπάρχει λοιπόν ένα μέρος για να βάζουμε εκεί τις εντολές μας. Αν λοιπόν έχω εκεί μια δικιά μου εντολή με όνομα youtube2mp3 θα μπορώ να την τρέχω γράφοντας απλά

$ ${HOME}/.local/bin/youtube2mp3

και όλα καλά.

Ρε πας καλά;

Εντάξει εντάξει το παραδέχομαι. Το να γράφεις σκέτα youtube2mp3, όπως όταν γράφεις youtube-dl είναι κάπως καλύτερο. Δεκτό. Ας το κάνουμε έτσι να μην μου γκρινιάζεις.

Πού είναι εγκατεστημένο το youtube-dl μιας και το έφερε η κουβέντα; Για να δούμε

$ which youtube-dl

και είναι σε ένα φάκελο με όνομα bin.

Αλλό ρώτησες όμως. Εντάξει, εντάξει θα σου πω. Αλλά πρώτα λίγη ακόμα προετοιμασία! Στο τερματικό δώσε τώρα τις εντολές

$ touch ${HOME}/.shellrc
$ chmod +x ~/.shellrc
$ xdg-open !$

Τελικά θα μου πεις; Και τι είναι πάλι αυτό το !$;

Είναι τα ορίσματα της προηγούμενης εντολής, το κέλυφος κρατάει ένα ιστορικό εντολών και μπορούμε να μάθουμε πολλά χρήσιμα κόλπα ώστε να μην γράφουμε πολλά και να μειώσουμε τα ορθογραφικά λάθη. Θα το αφήσω για μια άλλη στιγμή, αλλά ελπίζω να ανακάλυψες ήδη τι κάνει το πάνω/κάτω βελάκι του πληκτρολογίου. Η πρώτη εντολή θα φτιάξει ένα αρχείο και η δεύτερη θα του κάνει διπλό κλικ. Και θα ανοίξει ένα κειμενογράφος και εκεί μέσα θα γράψουμε

echo "Γεία σου είμαι το αρχείο .shellrc"

Θα αποθηκεύσουμε και θα κλείσουμε το αρχείο. Μετά θα δώσουμε την εντολή

$ xdg-open ~/.bashrc

Στο τέλος αυτού του αρχείου θα προσθέσουμε μια γραμμή που θα λέει

source ${HOME}/.shellrc

Αποθηκεύουμε και κλείνουμε αυτό το αρχείο. Δεν θα το χρειαστούμε άλλο. Για να δούμε τι κάνει η εντολή αυτή την γράφουμε και στο τερματικό. Και θα δούμε το μήνυμα. Η εντολή source ή για τους φίλους ένα σκέτο . είναι σαν να πληκτρολογούμε στο κέλυφος αυτά που έχει μέσα το αρχείο. Δεν είναι απαραίτητο να έχει γίνει εκτελέσιμο με την εντολή chmod +x. Θα μπορούσες να πεις ότι τρέχει την εντολή. Αλλά η πραγματική εντολή για να τρέξει κάτι είναι η εντολή exec (που αυτή όμως απαιτεί να είναι εκτελέσιμο το αρχείο).

$ exec ${HOME}/.shellrc

που τρέχει και κλέινει και το τερματικό. Άνοιξε ένα καινούργιο τερματικό και δες το μύνημα να σε καλοσωρίζει.

Είναι σημαντικό να το κάνεις και να δεις το μήνυμα. Έτσι θα δεις αν το αρχείο .shellrc εκτελείται. Το ποια αρχεία θα τρέξει το bash σε μια διανομή και πότε είναι ένα μπερδεμένο πράγμα μιας και το ένα κάνει source το άλλο και άλλα εκτελούνται όταν ανοίγεις ένα τερματικό, και άλλα όταν ξεκινάς μια συνεδρία. Συνήθως βάζω το τερματικό να ξεκινά πάντα μια συνεδρία για να είμαι σίγουρος. Αυτό κάνει η ρύθμιση «Εκτέλεση εντολής ως κέλυφος εισόδου». Ο άλλος λόγος είναι ότι υπάρχουν περιπτώσεις πραγμάτων που δουλεύω καθημερινά όπου αυτό κάνει την διαφορά. Αλλά ας μην στενοχωρηθούμε με αυτό άλλο.

Τι καταφέραμε μέχρι στιγμής; Με το που θα ξεκινά ένα τερματικό θα «τρέχει» το αρχείο ${HOME}/.shellrc και θα βλέπω ένα μήνυμα. Γιατί το κάνω αυτό; Για δύο λόγους. Έτσι θα ξέρω τι αλλαγές έχω κάνει και θα μπορώ να τις μεταφέρω εύκολα από υπολογιστή σε υπολογιστή. Επίσης το κέλυφος εργασίας μου είναι άλλο και το λένε zsh. To zsh δίνει μια καλύτερη εμπειρία διαδραστικής χρήσης, αλλά δεν κάνει κάτι παραπάνω προγραμματιστικά. Τα κοινά πράγματα μεταξύ των δύο τα βάζω σε αυτό το αρχείο και κάνω σε ένα μόνο μέρος την αλλαγή. Ας ανοίξουμε τώρα το αρχείο .shellrc, αν το έχουμε κλείσει και θα γράψουμε τα παρακάτω

#!/bin/bash

## Path management
function add_to_path_front () {
   if ! echo $PATH | /bin/grep -Eq "(^|:)$1($|:)" ; then
     export PATH=$1:$PATH
   fi
}

add_to_path_front ${HOME}/anaconda3/bin
add_to_path_front ${HOME}/.local/bin

##
## Functions
##

# A better man
function man() {
  if [[ "$(type -t $1)" == "builtin" ]] ; then 
    help -m "$@";
  elif [ "$DISPLAY" ]; then
    (yelp "man:$@" &) ;
  else
    /usr/bin/man "$@";
  fi
}

# Move to trash
alias trashcan="gvfs-trash"

# Show paths one line per folder
alias show_path='echo "echo $PATH | tr \: \\n'

# reload ~/.shellrc
alias reload_shellrc='source ${HOME}/.shellrc'

# Delete this after some days
echo "~/.shellrc loaded"

Στην αρχή φτιάχνω μια συνάρτηση που προσθέτει πράγματα στην αρχή της μεταβλητής περιβάλλοντος $PATH. Ο τρόπος που ο περισσότερος κόσμος το κάνει είναι με την εντολή

export PATH=${HOME}/.local/bin:${PATH}

που προσθέτει στην αρχή της μεταβλητής περιβάλλοντος PATH την διαδρομή και μετά την κάνει πάλι εξαγωγή στο περιβάλλον. Αν δεν την κάνεις εξαγωγή η αλλαγή θα είναι τοπική όπως εξηγήθηκε παραπάνω. Μπορούμε να δούμε τι περιέχει η μεταβλητή με ένα απλό

$ echo $PATH

Αλλά ήρθε η ώρα να δούμε τις αλλαγές. Ανοίγουμε ένα καινούργιο τερματικό ή κάνουμε

$ source ~/.shellrc

και δίνουμε την καινούργια εντολή

$ show_path

και θα δούμε τις διαδρομές κάπως καλύτερα. Και είδαμε και τα ψευδώνυμα (alias) των εντολών. Τα ψευδώνυμα είναι ένας άλλος τρόπος να προσθέσουμε εντολές, ειδικά αν είναι μικρές. Και έχουμε δει και ένα τρίτο τρόπο. Ποιος είναι αυτός; Για σκέψου λίγο. Είναι οι συναρτήσεις όπως η add_to_path_front. Υπάρχει όμως μια διαφορά. Τα ψευδώνυμα και οι συναρτήσεις υπάρχουν μέσα στο κέλυφος. Τα σενάρια(scripts) είναι διαθέσιμα και στο γραφικό περιβάλλον. Μπορούμε να δούμε τι είναι τι με την εντολή type (η με την whence στο zsh)

$ type ls
$ type reload_shellrc
$ type add_to_path_front
$ type gvfs-trash
$ which gvfs-trash

Δεν εξηγώ τι κάνουν τα ακατανόητα σύμβολα στις εντολές grep και tr αυτά είναι λεγόμενες «κανονικές εκφράσεις» (regular expessions ή regexp) και είναι κάτι σαν την γνωστή αριθμητική αλλά σε κείμενο και όχι σε αριθμούς. Θα σου τις εξηγήσω μια μέρα, θες δε θες, αλλά όχι σήμερα. Μπορείς όμως (μαζόχα) να βρεις κάποιες χρήσεις της εντολής grep εδώ.

Η πρώτη γραμμή #!/bin/bash (που την λέμε μαγική) εδώ δεν είναι απαραίτητη, μιας και δεν τρέχουμε (exec) το αρχείο αλλά το ενσωματώνουμε (source). Αλλά βοηθά τον διορθωτή να καταλάβει τι είναι και να χρωματίσει σωστά τον κώδικά. Και ο χρωματιστός κώδικάς βοηθά να εντοπίζουμε αμέσως κάποια λάθη όπως να ξεχάσεις ένα εισαγωγικό πριν ακόμα τρέξεις τον κώδικα.

Περί έρωτος και άλλων δαιμόνων****

Λένε πως οι καλύτεροι έρωτες είναι οι ανεκπλήρωτοι, αλλά εγώ δεν τους πιστεύω. Αλλού ξεκινήσαμε και αλλού καταλήξαμε. Αλλά όπως ανακάλυψε και ο μικρός Μπάστιαν στην Ιστορία χωρίς τέλος του Μιχαέλ Έντε, μια ιστορία ποτέ δεν τελειώνει αφού οι καλές ιστορίες δημιουργούν άλλες ιστορίες.

Αν δεν κατάλαβες μην διστάσεις να κάνεις ερωτήσεις. Δεν υπάρχουν χαζές ερωτήσεις. Υπάρχουν μόνο χαζοί άνθρωποι. Και χαζοί άνθρωποι είναι αυτοί που λένε χαζούς αυτούς που κάνουν χαζές ερωτήσεις. Να προσπαθήσεις πρώτα λίγο μόνο σου πρώτα όμως έτσι;

Όσο για την προσδοκία που είχες ότι θα μάθαινες για το expect και τις προσδοκίες του, να προσδοκάς ένα επόμενο άρθρο.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment