Die erste Zeile bestimmt den Kommandointerpreter. Du hast hier mit /bin/sh die Bourne-Shell(bzw. den Bourne-Shell-kompatiblen Modus). /bin/bash ist die Bourne-Again-Shell. Das ist die Bourne-Shell aufgemotzt mit 10000 mehr Funktionen.
Die Funktionen, die Du benutzt gehen eben nur mit der Bash und nicht mit der Bourne-Shell.
Je nach dem wo Du Deine Scripte einsetzt wähle den richtigen Interpreter. Falls Du nur für Dich selber ein bisschen Scriptest oder immer auf halbwegs aktuellen Linux-Kisten, dann kannst Du ruhig bei der Bash bleiben. Falls Du darauf angewiesen bist, dass Deine Script auf einer grossen Zahl von unterschiedlichen Unixartigen Systemen laufen, dann wähle besser die Bash.
Ist Deine Zielplattform der Embedded-Bereich, dann würde ich auch eher zur Bourne-Shell greifen oder zu
Dash(Debian-Alquimist-Shell), eine 3. Variante(Es gibt noch viele mehr), die viele Zusatzfunktionen integriert hat, aber alles was viel Code erfordert hat weggelassen hat. So ist die Dash eine Shell, mit der man viel von dem Komfort der Bash hat, aber auch nur ein kleines Programm.
Hier sieht man auch nochmal den Unterschied der Shells in Sachen Programmgrösse...
Code: Alles auswählen
ls -l /bin/bash /bin/dash
-rwxr-xr-x 1 root root 1029624 Nov 13 2014 /bin/bash
-rwxr-xr-x 1 root root 125400 Nov 8 2014 /bin/dash
...und auch bzgl. der benutzten Bibliotheken:
Code: Alles auswählen
ldd /bin/dash
linux-vdso.so.1 (0x00007ffeb87a2000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff00fa62000)
/lib64/ld-linux-x86-64.so.2 (0x00007ff01002e000)
ldd /bin/bash
linux-vdso.so.1 (0x00007fff49bbc000)
libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007fa71ec31000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fa71ea07000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa71e803000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa71e458000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa71ee56000)