Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Making Unix shell scripts POSIX compliant

I have been working on a shell script to automate some tasks. What is the best way to make sure the shell script would run without any issues in most of the platforms. For ex., I have been using echo -n command to print some messages to the screen without a trailing new line and the -n switch doesn't work in some ksh shells. I was told the script must be POSIX compliant. How do I make sure that the script is POSIX compliant. Is there a tool? Or is there a shell that supports only bare minimum POSIX requirements?

like image 307
Prabhu Avatar asked Dec 01 '16 16:12

Prabhu


People also ask

Is shell POSIX compliant?

Since POSIX is a specification, there is no shell called POSIX shell. You can use POSIX standard in many shells such as, dash , bash , ksh , mksh , yash , zsh , etc. You need to be aware that each shell has its own commands and options or different options top of the POSIX specification.

What is a POSIX shell script?

POSIX Shell is a command line shell for computer operating system which was introduced by IEEE Computer Society. POSIX stands for Portable Operating System Interface. POSIX Shell is based on the standard defined in Portable Operating System Interface (POSIX) – IEEE P1003.

What is a POSIX compatible shell?

POSIX defines the application programming interface (API), along with Unix command line shells and utility interfaces. This ensure software compatibility with flavors of Unix and other operating systems. The POSIX shell is implemented for many UNIX like operating systems.

Is Linux fully POSIX compliant?

Minix (from mini-Unix) is a Unix-like operating system based on a microkernel architecture. Since version 2.0, it has been Portable Operating System Interface (POSIX) compliant. Andrew S.


1 Answers

POSIX

One first step, which gives you indications of what works or not and why, is to set the shebang to /bin/sh and use shellcheck site to analyze your script.
For example, paste this script in the shellcheck editor window:

#!/bin/sh
read -r a b <<<"$1"
echo $((a+b))

to get an indication that: "In POSIX sh, here-strings are undefined".

As a second step, you can use a shell that is as compatible with POSIX as possible.
One shell that is compatible with most other simple shells, is dash, Debian default system shell, which is a derivative of the older BSD ash.

Another shell compatible with posix is posh.

However, dash and/or posh may not be available for some systems.

There is lksh (with a ksh flavor), with the goal to be compatible with legacy (old) shell scripts. From its manual:

lksh is a command interpreter intended exclusively for running legacy shell scripts.

But there is the need to use options when calling lksh, like -o posix and -o sh:

Note that it's strongly recommended to invoke lksh with at least the -o posix option, if not both that and -o sh, to fully enjoy better compatibility to the POSIX standard (which is probably why you use lksh over mksh in the first place) or legacy scripts, respectively.

You would call lksh -o posix -o sh instead of the simple lksh.

Using options is a way to make other shells become POSIX compatible. Like lksh, using the option -o posix, like bash -o posix.

In bash, it is even possible to turn the POSIX option inside an script, with:

shopt -o posix            # also with: set -o posix

It is also possible to make a local link to bash or zsh that makes both act like an old sh shell. Like this:

$ ln -s /bin/bash ./sh
$ ./sh

There are plenty of alternatives (dash, posh, lksh, bash, zsh, etc.) to get a shell that will work as a POSIX shell.

Portable

However, even so, all the above does not ensure "portability".

Unfortunately, making a shell script 'POSIX-compliant' is usually easier than making it run on any real-world shell.

The only real-world sensible recommendation is test your script in several shells.
Like the list above: dash, posh, lksh, and bash --posix.

Solaris is a world on its own, probably you will need to test against /bin/sh and xpg4/sh.

Followup:

How can I test for POSIX compliance for shell scripts?

like image 76
IsaaC Avatar answered Sep 26 '22 06:09

IsaaC