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