Κέλυφος bash

Το 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.