当我决定将函数移动到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
答案 0 :(得分:13)
sh
的语法文件实际上处理了几种不同类型的shell语法:bash
,ksh
和普通的sh
。由于您的配置文件无法识别为bash
或ksh
,因此会回退到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。例如,
/bin/sh
是/bin/dash
。/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。