Bourne to Bourne Again Shell Forward Compatibility

Introduction

An interpreter for some variant of Bourne Shell is available as an executable /bin/sh on most Linux and UNIX systems. Writing Bourne Shell script has the possible advantage that such a script can work on all these systems with no changes to the code; be it Linux, AIX, FreeBSD, initramfs or a string passed to a C library call system(3), expressions such as

  • echo hello | wc
  • my_pid=$$

or

  • exit 1

would always work.

Recently, i used GNU Bourne Again Shell for scripting, and i wondered if all of my Bourne Shell practices were portable. In this article i highlight some code constructs i found that work in Bourne Shell and do not work as expected in Bourne Again Shell. Code currently interpreted by /bin/sh and containing such constructs must be reviewed if will be interpreted by /bin/bash.

I will focus on reserved words and built-ins, brace expansion and pipeline sub-processes.