vim red highlight $( )
The syntax file for sh
actually handles several different kinds of shell syntax: bash
, ksh
, and plain old sh
. Since your conf file isn't recognized as bash
or ksh
, it falls back to sh
. $(...)
isn't a valid construct in sh
, so it is highlighted as an error.
To fix this, you can make sure "g:is_bash" is set for the file, so that the sh
syntax script will know your file should be highlighted as bash
code. Please edit your question to include what you added to your .vimrc
to make the file use sh
syntax highlighting. This will make it easier to suggest the correct way of setting "g:is_bash".
UPDATE: As Alok commented, you should be able to add the following to the file
#!/bin/bash
to let vim
know the correct syntax highlighting to use as well.
In my case, I wanted to preserve #!/bin/sh
as the shebang line because not every system has /bin/bash
available.
Whereas the original Bourne shell may have not supported the $(...)
syntax, most sh
shells nowadays are POSIX-compliant, and the POSIX spec supports this syntax. For example,
- On Ubuntu,
/bin/sh
is/bin/dash
. - On MacOS,
/bin/sh
is/bin/bash
. - On Alpine,
/bin/sh
is/bin/ash
.
All of which satisfy the POSIX spec. Traditionally, if we'd like to write portable Shell, we should leave the shebang line as #!/bin/sh
. We shouldn't change it to #!/bin/bash
just for syntax highlighting if we're not going to use any Bashisms.
Okay, but what about the erroneous red highlighting? The problem is with Vim interpreting #!/bin/sh
as a reference to the original Bourne shell from 1979 with no support for $(...)
. Maybe this is a testament to Vim's backwards compatibility, or maybe not enough people care. Here's a related GitHub issue describing the same behavior.
In any case, the best solution for me was to set let g:is_posix = 1
in my config. Interestingly, if you look through Vim's runtime files, it's equivalent to setting let g:is_kornshell = 1
.
A brief interesting history on how the Bourne shell was bourne, bourne again as bash
as a substitute for /bin/sh
on Ubuntu, and eventually replaced in favor of dash
can be found at https://askubuntu.com/a/976504.