13

当我决定将函数移动到一个 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,但这是一个不错的解决方案

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

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

4

2 回答 2

16

的语法文件sh实际上处理了几种不同的 shell 语法:bash, ksh, 和plain old sh。由于您的 conf 文件未被识别为bashor ksh,因此它回退到sh. $(...)不是 中的有效构造sh,因此将其突出显示为错误。

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

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

#!/bin/bash

vim知道要使用的正确语法突出显示。

于 2013-02-06T15:55:44.150 回答
8

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

虽然最初的 Bourne shell 可能不支持该$(...)语法,但sh现在大多数 shell 都符合 POSIX 标准,并且POSIX 规范支持这种语法。例如,

  • 在 Ubuntu 上,/bin/sh/bin/dash.
  • 在 MacOS 上,/bin/sh/bin/bash.
  • 在阿尔卑斯山,/bin/sh/bin/ash

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

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

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


可以在https://askubuntu.com/a/976504bash找到关于 Bourne shell 如何被 bourne、bourne 再次作为 Ubuntu 上的替代品/bin/sh并最终被替换为支持的简短有趣历史。 dash

于 2020-04-23T08:30:52.780 回答