Informationen zur Bourne Again Shell Version 3.0

Änderungen gegenüber der Bash 2.05

Das neue Major-Release bietet einige neue Funktionen, beseitigt aber in erster Linie zahlreiche Fehler älterer Fassungen.

  • Änderungen in der Historysteuerung
    • Die Variable HISTCONTROL
      • ist jetzt eine durch Doppelpunkt getrennte Liste von Optionen.
      • hat die neue Option "erasedups", wo ein bestimmtes Kommando nur einmal abgespeichert wird.
    • ...

  • Die neue Variable HISTTIMEFORMAT dient zur Steuerung des Zeitstempels in der History.
    Dies wird möglich durch die Einbindung des Bibliotheksfunktion "strftime" in die Bash.

          Beispiel:

          [ghe@muehle ]$ HISTTIMEFORMAT="(%d.%m.%Y) %H:%M"
          [ghe@muehle ]$ history
          ...
            850  (20.10.2005) 11:18ls
            851  (20.10.2005) 11:18pwd
            852  (20.10.2005) 11:19vi PUBLIC/.bashrc
            853  (20.10.2005) 11:27HISTTIMEFORMAT="(%d.%m.%Y) %H:%M"
            854  (20.10.2005) 11:27history     

          [ghe@muehle ~]$ unset HISTTIMEFORMAT
          ...
            858  HISTTIMEFORMAT="(%d.%m.%Y) %H:%M"
            859  history
            860  unset HISTTIMEFORMAT
            861  history
          [ghe@muehle ~]$

  • Das [ [ ... ] ] Kommando besitzt eine neuen binären Operator '=~'. Es können erweiterte reguläre Ausdrücke behandelt werden (wie bei egrep).


          Beispiel:

          [ghe@muehle ~]$[[ "aaaaby" =~ "a*b*" ]] && echo ja || echo nein
          ja
          [ghe@muehle ~]$[[ "aaaaby" =~ "ub*" ]] && echo ja || echo nein
          nein

  • Unterstützung von Multibytezeichen
    Damit ist die Arbeit mit sogennanten CJK-Sprachen möglich.

  • Integration des 'gettext'-Paketes und 'libintl' zur Translation von Shellnachrichten in mehrere Sprachen.

  • Weitgehende Überarbeitung des Debuggers:
    • viele neue Variable (BASH_ARGC, BASH_ARGV, BASH_SOURCE, BASH_LINENO, BASH_SUBSHELL, BASH_EXECUTION_STRING, BASH_COMMAND
    • neue Funktionalität (errtrace, functrace, ...)

  • Erweiterung der Klammer-Expansion: {x..y}

    {x..y} bedeutet: {x,x+1,x+2,...,y}

Beispiel 1 aus dem Advanced Bash-Scripting Guide:


          #!/bin/bash

          for i in {1..10}
          #  Simpler and more straightforward than
          #+ for i in $(seq 10)
          do
            echo -n "$i "
          done

          echo

          # 1 2 3 4 5 6 7 8 9 10

          

Beispiel 2:


          bash 3:
          ======

          [ghe@springer bin]$echo foo{1..4}bar
          foo1bar foo2bar foo3bar foo4bar

          bash 2.05:
          ==========

          [ghe@petronius ghe]$echo foo{1..4}bar
          foo{1..4}bar


          Beispiel 3:

          [ghe@muehle ~]$for i in {a..d};do echo $i;done
          a
          b
          c
          d

  • ${!array[@]} Operator,
    der zu allen Indizes eines Feldes expandiert.

Beispiel aus dem Advanced Bash-Scripting Guide:


          #!/bin/bash

          Array=(element-zero element-one element-two element-three)

          echo ${Array[0]}   # element-zero
                             # First element of array.

          echo ${!Array[@]}  # 0 1 2 3
                             # All the indices of Array.

          for i in ${!Array[@]}
          do
            echo ${Array[i]} # element-zero
                             # element-one
                             # element-two
                             # element-three
                             #
                             # All the elements in Array.
          done

  • "\W"-Parameter im Prompt ersetzt $HOME als "~" (wie bei "\w")


          Beispiel: $HOME=/afs/tu-chemnitz.de/home/urz/g/ghe
                    $PS1="[\u@\h \W]\$ "

          bash 2.05:
          ==========

            [ghe@petronius tmp]$ cd
            [ghe@petronius ghe]$

          bash 3:
          =======
            [ghe@muehle tmp]$ cd
            [ghe@muehle ~]$ 

Kompatibilitätsprobleme mit der Bash 2.05

Variable LINENO

Die Variable ist nicht mehr durch den Nutzer änderbar. Damit erfolgt eine Korrekte Anzeige der Zeilennummer vom Beginn des Scripts an.


          bash 2.05:
          =========

          [ghe@petronius ghe]$ LINENO=14
          [ghe@petronius ghe]$ echo $LINENO
          15
          [ghe@petronius ghe]$ LINENO=28
          [ghe@petronius ghe]$ echo $LINENO
          29
          [ghe@petronius ghe]$  

          bash 3.0:
          =========

          [ghe@muehle ~]$LINENO=14
          [ghe@muehle ~]$echo $LINENO
          2
          [ghe@muehle ~]$LINENO=28
          [ghe@muehle ~]$echo $LINENO
          4

Inline-Kommando printf

Die Oktaldarstellung entspricht nunmehr offenbar dem "IEEE Std 1003.1-2001, Chapter 5, File Format Notation"

Die Version 3 interpretiert die Oktaldarstellung nicht wie im Manual beschrieben!

Lt. Manual beginnt eine Oktaldarstellung mit \0 und hat danach maximal 3 Zeichen mit dem oktalen Wert NNN. Bei der neuen Version wird eine Oktalzahl in der Form \NNN erkannt .

Anmerkung; Das Kommado /usr/bin/printf interpretiert in der gleichen Weise.


          bash3:
          ======

          [ghe@muehle ~]$ printf "|\0177|\n" | cat -A
          |^O7|$

          [ghe@Muehle ~]$ printf '|\0178|\n' | cat -A
          |^O8|$ 

          [ghe@muehle ~]$printf "|\177|\n" | cat -A
          |^?|$

 

          bash 2.05:
          ==========

          [ghe@petronius ghe]$ printf "|\0177|\n" | cat -A
          |^?|$
          [ghe@petronius ghe]$

...

Links zur Vertiefung