Is there any sh code that is not syntactically valid bash code (won't barf on syntax)?
I am thinking of overwriting sh with bash for certain commands.
Is there any sh code that is not syntactically valid bash code (won't barf on syntax)?
I am thinking of overwriting sh with bash for certain commands.
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 [[ and 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()(:)
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:
a():
Valid in dash, but not POSIX compliant.