在vim中编辑bash脚本,<<<括号会导致颜色损坏

时间:2015-09-17 10:46:28

标签: bash vim vi

我继承了几个使用以下语法从一个字符串读入数组的bash脚本:

read -a arr <<<$line

但是,这会导致vim中的颜色格式化。有人可以建议快速修复吗?

更新

忽略脚本的内容,但请注意'&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;字符(即echo语句为紫色):

enter image description here

3 个答案:

答案 0 :(得分:7)

如果缺少#!/bin/bash shebang行,就会发生这种情况。 Vim将脚本解释为plain sh而不是bash。 <<<是一种抨击。

来自sh.syntax

" trying to answer the question: which shell is /bin/sh, really?
" If the user has not specified any of g:is_kornshell, g:is_bash, g:is_posix, g:is_sh, then guess.
if !exists("g:is_kornshell") && !exists("g:is_bash") && !exists("g:is_posix") && !exists("g:is_sh")
 let s:shell = ""
 if executable("/bin/sh")
  let s:shell = resolve("/bin/sh")
 elseif executable("/usr/bin/sh")
  let s:shell = resolve("/usr/bin/sh")
 endif
 if     s:shell =~ 'bash$'
  let g:is_bash= 1
 elseif s:shell =~ 'ksh$'
  let g:is_kornshell = 1
 elseif s:shell =~ 'dash$'
  let g:is_posix = 1
 endif
 unlet s:shell
endif

" Here Strings: {{{1
" =============
" available for: bash; ksh (really should be ksh93 only) but not if its a posix
if exists("b:is_bash") || (exists("b:is_kornshell") && !exists("g:is_posix"))
 syn match shRedir "<<<"        skipwhite       nextgroup=shCmdParenRegion
endif

答案 1 :(得分:3)

看起来vim支持sh语法文件中的<<<构造,但只有当它认为该文件是bash脚本时它才会识别它。有些方法可以让vim认为文件是bash:

  1. 给它一个#!/bin/bash的shebang,而不只是#!/bin/sh(如果文件使用特定于bash的结构,这是最佳做法)

  2. 您正在编辑的系统上的/bin/shbash的符号链接(meh)

  3. let g:is_bash = 1添加到.vimrc以使vim默认假设shell脚本是bash。

答案 2 :(得分:1)

为了让其他人更容易了解问题的原因,我使用OS X Yosemite 10.10.5vim 7.4.640进行了快速测试,屏幕截图如下:

enter image description here

enter image description here

正如其他答案所指出的那样,使用#!/bin/bash作为shebang行为我解决了问题。