vim red highlight $()

时间:2013-02-06 15:28:47

标签: bash vim ubuntu sh

当我决定将函数移动到lib文件时,我正在编写脚本,但是当我打开lib文件时,所有$(和连续)都突出显示为红色,这里有一些示例脚本

TAB="$(printf '\t')"
percent=$(echo "scale=2; $number/$total*100" | bc | sed -e 's/\.[[:digit:]]*//g')
if [[ -z $(grep $site/post $max_lim) ]];then

文件类型是conf,但我在.vimrc中将其设置为sh语法

知道发生了什么事吗?

谢谢


编辑:感谢您的快速解答,我发现此行使vim与*后面指定扩展名的文件匹配,语法为sh

au BufReadPost * set syntax=sh

我还认为不允许在库中使用shebang,但这是一个很好的解决方案

无论如何在.vimrc中使用g:is_bash会返回未找到模式的错误

所以我想做的是因为我只用bash写,vim识别任何没有扩展名的文件作为bash

2 个答案:

答案 0 :(得分:13)

sh的语法文件实际上处理了几种不同类型的shell语法:bashksh和普通的sh。由于您的配置文件无法识别为bashksh,因此会回退到sh$(...)不是sh中的有效构造,因此会突出显示为错误。

要解决此问题,您可以确保为文件设置了“g:is_bash”,以便sh语法脚本知道您的文件应突出显示为bash代码。请修改您的问题,以包含您添加到.vimrc的内容,以使文件使用sh语法突出显示。这样可以更容易地建议设置“g:is_bash”的正确方法。

更新:正如Alok评论的那样,您应该能够将以下内容添加到文件

#!/bin/bash

vim知道正确使用的语法高亮显示。

答案 1 :(得分:5)

就我而言,我想保留#!/bin/sh作为shebang行,因为并非每个系统都有/bin/bash可用。

尽管原始的Bourne Shell可能不支持$(...)语法,但如今大多数sh Shell都符合POSIX和the POSIX spec supports this syntax。例如,

  • 在Ubuntu上,/bin/sh/bin/dash
  • 在MacOS上,/bin/sh/bin/bash
  • 在高山上,/bin/sh/bin/ash

所有这些都满足POSIX规范。传统上,如果我们想编写可移植的Shell,则应将shebang行保留为#!/bin/sh。如果我们不打算使用任何Bashism,则不应仅将其更改为#!/bin/bash

好的,但是错误的红色突出显示呢?问题是Vim将#!/bin/sh解释为对the original Bourne shell from 1979的引用,却不支持$(...)。也许这证明了Vim的向后兼容性,或者没有足够的人关心。这是related GitHub issue,描述了相同的行为。

无论如何,对我来说最好的解决方案是在我的配置中设置let g:is_posix = 1。有趣的是,如果您浏览Vim的运行时文件,就相当于设置let g:is_kornshell = 1


关于伯恩(Bourne)外壳是如何伯恩的简短历史,伯恩再次以bash替代Ubuntu上的/bin/sh,并最终被dash所取代https://askubuntu.com/a/976504