Εικόνα του bash και του sh, η οποία δείχνει κάποια χαρακτηριστικά τους.
Το **Bash** είναι ένα κέλυφος ελεύθερου λογισμικού του Unix που δημιουργήθηκε από το εγχείρημα GNU. Τα αρχικά του ονόματός του προκύπτουν από την έκφραση *Bourne-again shell*. Το όνομα είναι λογοπαίγνιο βασισμένο στο όνομα του κελύφους Bourne (sh), ενός παλιού αλλά σημαντικού κελύφους του Unix που είχε γραφτεί από τον Stephen Bourne και κυκλοφόρησε με την 7η Έκδοση του Unix γύρω στο 1978, και στην κλασική έννοια του Χριστιανισμού, την *αναγέννηση* (*born again*). Το Bash δημιουργήθηκε το 1987 από τον Brian Fox. Το 1990 βασικός προγραμματιστής του έγινε ο Chet Ramey.

Το Bash είναι ένα κέλυφος σύμφωνο με το πρότυπο POSIX με κάποιες επεκτάσεις, ενώ είναι και το κέλυφος του λειτουργικού συστήματος GNU του εγχειρήματος GNU. Μπορεί να τρέξει στα πιο πολλά Unix-οειδή λειτουργικά συστήματα. Είναι το προεπιλεγμένο κέλυφος στα περισσότερα συστήματα που βασίζονται στον πυρήνα του Linux καθώς και στο Mac OS X και στο Darwin. Έχει επίσης μεταφερθεί στα Microsoft Windows με τη χρήση του Υποσυστήματος για Unix εφαρμογές (Subsystem for UNIX-based Applications, SUA), ή της εξομοίωσης POSIX που παρέχει το Cygwin και το MSYS. Έχει μεταφερθεί επίσης στο MS-DOS από το εγχείρημα DJGPP και στο Novell NetWare.

Χαρακτηριστικά
--------------

Η σύνταξη των εντολών του Bash είναι υπερσύνολο της σύνταξης των εντολών του κελύφους Bourne. Τα πιο πολλά σενάρια κελύφους Bourne μπορούν να εκτελεστούν από το Bash χωρίς καμία αλλαγή, με την εξαίρεση σεναρίων που χρησιμοποιούν ιδιαίτερη συμπεριφορά της σύνταξης που ερμηνεύεται διαφορετικά στο Bash (π.χ. εμφωλευμένες παρενθέσεις στο Bash, σε παλαιότερη έκδοση του σεναρίου εκκίνησης του Mozilla), ή που προσπαθούν να εκτελέσουν μια εντολή του συστήματος που έχει το ίδιο όνομα με μια καινούρια ενσωματωμένη εντολή του bash, κλπ. Η σύνταξη των εντολών του Bash περιλαμβάνει ιδέες από το κέλυφος Korn (ksh) και το Κέλυφος C (csh), όπως η δυνατότητα διόρθωσης της γραμμής εντολών, το ιστορικό εντολών, η στοίβα φακέλων, οι μεταβλητές $RANDOM και $PPID, και η σύνταξη αντικατάστασης εντολών POSIX $(…). Όταν χρησιμοποιείται σαν διαδραστικό κέλυφος εντολών, το πλήκτρο TAB, προκαλεί την αυτόματη συμπλήρωση γραμμής εντολών με βάση μισά ονόματα προγραμμάτων, αρχείων ή μεταβλητών, τα οποία έχει πληκτρολογήσει ο χρήστης.

Η σύνταξη του Bash έχει αρκετές επεκτάσεις που λείπουν από το κέλυφος Bourne. Σε αντίθεση με το Bourne, το Bash μπορεί να κάνει πράξεις με ακέραιους χωρίς να ξεκινά εξωτερικές διεργασίες. Το Bash χρησιμοποιεί την εντολή ((…)) και τη σύνταξη μεταβλητών $((…)) για αυτόν το σκοπό. Η σύνταξη του Bash απλοποιεί την ανακατεύθυνση εισόδου-εξόδου με τρόπους που ήταν αδύνατοι στο κλασικό κέλυφος Bourne, π.χ. το Bash μπορεί να ανακατευθύνει την καθιερωμένη έξοδο (stdout) και την καθιερωμένη έξοδο σφάλματος (stderr) ταυτόχρονα με χρήση του τελεστή &>. Αυτό είναι απλούστερο από την αντίστοιχη εντολή του κελύφους Bourne που είναι 'command > file 2>&1'.
Οι δηλώσεις συναρτήσεων του Bash (με τη χρήση της λέξης-κλειδί 'function') δεν είναι συμβατές με τα σενάρια για τα κελύφη Bourne/Korn/POSIX/C. Λόγω αυτής και άλλων παρόμοιων διαφορών, τα σενάρια για Bash σπάνια μπορούν να εκτελεστούν στα κελύφη Bourne ή Korn εκτός και αν έχουν ήδη γραφεί έτσι ώστε να είναι συμβατά, κάτι το οποίο, καθώς το Linux εξαπλώνεται, γίνεται λιγότερο συνηθισμένο.

Το Bash υποστηρίζει here documents όπως και το κέλυφος Bourne. Από την έκδοση 2.05b όμως, το Bash μπορεί να ανακατευθύνει την καθιερωμένη είσοδο (stdin) από ένα "here string" με τον τελεστή <<<.

Το Bash 3.0 υποστηρίζει κανονικές εκφράσεις μέσα σε διεργασίες, με μια σύνταξη σαν της Perl.

### Επέκταση αγκυλών

Η επέκταση αγκυλών είναι ένα χαρακτηριστικό που πρωτοεμφανίστηκε στο κέλυφος C, το οποίο επιτρέπει τη δημιουργία συμβολοσειρών με μια τεχνική που μοιάζει με την επέκταση ονομάτων αρχείων. Όμως, τα ονόματα που παράγονται δε χρειάζεται να υπάρχουν σαν αρχεία. Τα αποτελέσματα κάθε επεκτεταμένης συμβολοσειράς δεν ταξινομούνται και διατηρείται η σειρά από τα αριστερά προς τα δεξιά:

```
echo a{p,c,d,b}e # ape ace ade abe

```

Η επέκταση αγκυλών δεν πρέπει να χρησιμοποιείται σε σενάρια που πρόκειται να τρέξουν και σε άλλα κελύφη, γιατί το κέλυφος Bourne δε θα παράγει την ίδια έξοδ.

```
# Ένα κλασικό κέλυφος δεν παράγει την ίδια έξοδο
echo a{p,c,d,b}e # a{p,c,d,b}e

```

Όταν η επέκταση αγκυλών συνδυάζεται με χαρακτήρες μπαλαντέρ, πρώτα επεκτείνονται οι αγκύλες και στη συνέχεια γίνεται η επεξεργασία των χαρακτήρων μπαλαντέρ όπου εμφανίζονται. Με αυτόν τον τρόπο, μια λίστα από τις εικόνες σε JPEG και PNG του τρέχοντος καταλόγου μπορεί να προκύψει ως εξής:

```
ls *.{jpg,jpeg,png} # επεκτείνεται σε \*.jpg \*.jpeg \*.png - στη συνέχεια,
 # γίνεται η επεξεργασία των χαρακτήρων μπαλαντέρ

```

### Σενάρια εκκίνησης

Όταν ξεκινά το Bash, εκτελεί εντολές από διάφορα σενάρια.

Όταν καλείται σαν διαδραστικό κέλυφος εισόδου (login shell), πρώτα διαβάζει και εκτελεί τις εντολές από το αρχείο /etc/profile, αν αυτό υπάρχει. Στη συνέχεια, ψάχνει με τη σειρά για τα ~/.bash\_profile, ~/.bash\_login, και ~/.profile, και εκτελεί τις εντολές από το πρώτο από αυτά που υπάρχει και τα δεδομένα του είναι διαθέσιμα για ανάγνωση.

Όταν ένα κέλυφος εισόδου τερματίζει, το Bash διαβάζει και εκτελεί τις εντολές του αρχείου ~/.bash\_logout, αν υπάρχει.

Όταν αρχίζει ένα διαδραστικό κέλυφος που δεν είναι κέλυφος εισόδου, το Bash διαβάζει και εκτελεί τις εντολές του αρχείου ~/.bashrc, αν αυτό υπάρχει. Αυτό μπορεί να εμποδιστεί με την επιλογή --norc. Η επιλογή --rcfile file υποχρεώνει το Bash να διαβάσει και να εκτελέσει τις εντολές από το αρχείο file αντί για το ~/.bashrc.

Κάποιες εκδόσεις του Unix έχουν ειδικά σενάρια συστήματος για το Bash που αλλάζουν την παραπάνω σειρά ή προσπαθούν να λάβουν υπόψη τους και αρχεία σεναρίων για άλλα κελύφη.

### Μεταφερσιμότητα

Σενάρια κελύφους που έχουν γραφτεί με ειδικά χαρακτηριστικά του Bash (*bashisms*) δε λειτουργούν σε συστήματα με το κέλυφος Bourne ή κάποιον από τους αντικαταστάτες του, εκτός και αν το Bash είναι επίσης εγκατεστημένο και το σενάριο αρχίζει με μια "*γραμμή* *shebang*" με το περιεχόμενο *#!/bin/bash* αντί του *#!/bin/sh*.

### Συντομεύσεις πληκτρολογίου

Οι παρακάτω συντομεύσεις λειτουργούν χρησιμοποιώντας τον προεπιλεγμένο (Emacs) πίνακα πλήκτρων. Οι συντομεύσεις του vi μπορούν να ενεργοποιηθούν με την εκτέλεση της εντολής `set -o vi`.

Δείτε επίσης: Readline

* `Tab ⇆` : αυτόματη συμπλήρωση γραμμής εντολών από τη θέση του δρομέα.
* `Ctrl`+`a` : μεταφέρει το δρομέα στην αρχή της γραμμής (όπως το πλήκτρο Home).
* `Ctrl`+`e` : (τέλος) μεταφέρει το δρομέα στο τέλος της γραμμής (όπως το πλήκτρο End).
* `Ctrl`+`p` : (προηγούμενο) θυμάται την προηγούμενη εντολή (όπως το πλήκτρο Πάνω).
* `Ctrl`+`n` : (επόμενο) θυμάται την επόμενη εντολή (όπως το πλήκτρο Κάτω).
* `Ctrl`+`r` : (αναζήτηση) βρίσκει την τελευταία εντολή που περιέχει τους συγκεκριμένους χαρακτήρες. Δεύτερο πάτημα του συνδυασμού βρίσκει την προηγούμενη εντολή που ικανοποιεί τα κριτήρια της αναζήτησης
* `Ctrl`+`s` : Πηγαίνει πίσω στην πιο πρόσφατη εντολή της αναζήτησης (δεν πρέπει να εκτελείται σε τερματικό γιατί αντιστοιχεί στο σήμα τερματικού XOFF, βλ. παρακάτω).
* `Ctrl`+`q` : Αν η ρύθμιση XOFF έχει μεταβληθεί, ο συνδυασμός αυτός επιστρέφει στην προηγούμενη κατάσταση.
* `Ctrl`+`o` : εκτελεί την εντολή που βρέθηκε στην αναζήτηση.
* `Ctrl`+`l` : καθαρίζει την οθόνη (όπως η εντολή `clear`).
* `Ctrl`+`u` : καθαρίζει τα περιεχόμενα της γραμμής πριν το δρομέα και τα τοποθετεί στο πρόχειρο.
* `Ctrl`+`k` : καθαρίζει τα περιεχόμενα της γραμμής μετά το δρομέα και τα τοποθετεί στο πρόχειρο.
* `Ctrl`+`w` : καθαρίζει τα περιεχόμενα της λέξης πριν το δρομέα και τα τοποθετεί στο πρόχειρο.
* `Ctrl`+`y` : προσθέτει στη θέση του δρομέα τα περιεχόμενα του προχείρου.
* `Ctrl`+`d` : στέλνει ένα σημάδι EOF, το οποίο κλείνει το τρέχον κέλυφος (εκτός και αν έχει τροποποιηθεί η συμπεριφορά αυτή από κάποια επιλογή) - ισοδύναμο με την εντολή `exit`). (Μόνο αν δεν υπάρχει κείμενο στη γραμμή)
* `Ctrl`+`c` : στέλνει το σήμα SIGINT στην τρέχουσα διεργασία, η οποία και τερματίζεται και κλείνει.
* `Ctrl`+`z` : στέλνει το σήμα SIGTSTP στην τρέχουσα διεργασία, η οποία και τίθεται σε αναμονή (suspend). Η επιστροφή σε αυτή γίνεται με την εντολή `fg ['όνομα διεργασίας ή κωδικός']`.
* `Ctrl`+`x` 2 φορές : (λόγω του σχήματος του x) εναλλάσσεται το δείκτη μεταξύ της τρέχουσας και της προηγούμενης θέσης του.
* `Alt`+`f` : (μπροστά) μετακινεί το δείκτη μπροστά μια λέξη.
* `Alt`+`b` : (πίσω) μετακινεί το δείκτη πίσω μια λέξη.
* `Alt`+`Del` : κόβει τη λέξη πριν το δρομέα.
* `Alt`+`d` : κόβει τη λέξη μετά το δρομέα.
* `Alt`+`u` : κάνει κεφαλαίο κάθε γράμμα από τη θέση του δρομέα μέχρι το τέλος της τρέχουσας λέξης.
* `Alt`+`l` : κάνει πεζό κάθε γράμμα από τη θέση του δρομέα μέχρι το τέλος της τρέχουσας λέξης.
* `Alt`+`c` : κάνει κεφαλαίο το χαρακτήρα στη θέση του δρομέα και μετακινείται στο τέλος της λέξης.
* `Alt`+`r` : ακυρώνει τις όποιες αλλαγές και επιστρέφει στη γραμμή όπως ήταν στο ιστορικό.

Δείτε επίσης
------------

* Κέλυφος (υπολογιστές)
* Διερμηνέας γραμμής εντολών

Παραπομπές
----------

1. ↑  «bash-5.2.21.tar.gz». 9 Νοέμβριος 2023. Ανακτήθηκε στις 9 Νοέμβριος 2023.
2. 1 2  Error: Unable to display the reference properly. See the documentation for details.
3. ↑  C Programming by Al Stevens, Dr. Dobb's Journal, 1η Ιουλίου 2001
4. ↑  Rosalyn Lum (1 Ιουνίου 2005). «Fresh Faces». Dr. Dobb's Journal. Ανακτήθηκε στις 27 Φεβρουαρίου 2024.
5. ↑  Ramey, Chet (1 Αυγούστου 1994). «Bash - the GNU shell (Reflections and Lessons Learned)». *Linux Journal*. Ανακτήθηκε στις 13 Νοεμβρίου 2008.
6. ↑  Η σύνταξη μοιάζει με αυτή που φαίνεται στη σελίδα man `regex(7)`.

Εξωτερικοί σύνδεσμοι
--------------------

* Σελίδα του Bash (Αγγλικά)
* Εγχειρίδιο αναφοράς του GNU bash (Αγγλικά)
* Παρουσίαση bash/sed/awk από το FOSS του ΕΜΠ
* Προγραμματισμός Συστημάτων: Το κέλυφος Bash
* The Bourne-Again Shell, The Architecture of Open Source Applications, Volume I. (Αγγλικά)

  


|  |  |  |  |
| --- | --- | --- | --- |
| 

| π • σ • ε
Κελύφη του Unix |
| --- |
|  |
| 
* Bash
* Bourne
* (Debian) Almquist
* csh
* Es
* Esh
* Friendly interactive shell
* Korn
* PWB
* Perl
* Rc
* Scsh
* Stand-alone
* tcsh
* Τόμσον
* Wish
* Z
 |

 |