sh
TLDR
Start an interactive shell
SYNOPSIS
sh [-cefinvx] [script [argument...]]
DESCRIPTION
sh is the POSIX-compliant command interpreter (shell). It provides the standard shell scripting environment and is guaranteed to be available on all Unix-like systems.
On many Linux systems, /bin/sh is a symbolic link to another shell (dash, bash, etc.) running in POSIX-compatibility mode. This provides both compatibility and performance benefits.
Shell scripts beginning with #!/bin/sh use POSIX sh, ensuring maximum portability. Scripts needing bash-specific features should use #!/bin/bash instead.
The shell reads commands from standard input, a file, or the -c argument. It supports variables, control flow (if, while, for, case), functions, pipelines, and I/O redirection.
PARAMETERS
-c string
Execute commands from string-e
Exit immediately if a command exits with non-zero status-f
Disable filename globbing (wildcard expansion)-i
Interactive shell-n
Read commands but do not execute (syntax check)-v
Print shell input lines as they are read-x
Print commands and arguments as they are executed-u
Treat unset variables as an error+option
Turn off option
POSIX FEATURES
Variables: NAME=value, $NAME, ${NAME}
Quoting: 'literal', "interpolated", \escape
Conditionals: if-then-elif-else-fi, case-esac
Loops: while-do-done, for-in-do-done, until-do-done
Functions: name() { commands; }
Tests: [ condition ], test condition
Arithmetic: $((expression))
CAVEATS
POSIX sh lacks many bash features: arrays, [[ ]], brace expansion, process substitution, many string manipulations. Write portable scripts or explicitly require bash.
The -e option can cause unexpected exits. Commands in conditions (if, while) or with || / && don't trigger exit on failure.
Different systems link /bin/sh to different implementations (dash, bash, ksh). Test scripts on target systems or use explicit interpreters.
