Is there any
sh code that is not syntactically valid bash code (won't barf on syntax)?
I am thinking of overwriting
bash for certain commands.
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.Sign up to join this community
Here is some code that does something different in POSIX sh and Bash:
hello &> world
Whether that is "invalid" for you I don't know.
In Bash, it redirects both standard output and standard error from
hello into the file
world. In POSIX
sh, it runs
hello in the background and then makes an empty redirection into
world, truncating it (i.e. it's treated as
There are plenty of other cases where Bash extensions will do their thing when run under
bash, and would have different effects in a pure POSIX
sh. For example, brace expansion is another, and it too operates the same under Bash's POSIX mode and not.
As far as static syntax errors go, Bash has both reserved words (like
time) not specified by POSIX, such that
[[ x is valid POSIX shell code but a Bash syntax error, and a history of various POSIX incompatibility bugs that may result in syntax errors, such as the one from this question:
x=$(cat <<'EOF' ` EOF ) bash: line 2: unexpected EOF while looking for matching ``' bash: line 5: syntax error: unexpected end of file
Syntax-errors-only is a pretty dangerous definition of "invalid" for any circumstance where it matters, but there it is.
A short example:
time in Bash is a reserved word, and behaves differently from the
time program. It's quite likely you'll break some practical scripts trying to parse the result of
time by using bash. But technically it is not a syntax error. Redefining
time as a function would be rare but causes a syntax error as this question specifies.
A shorter example:
dash, but not POSIX compliant.