MAKE_LINTIAN_HAPPY和shell脚本中的单引号有什么作用?

Car*_*arl 1 linux shell sh

sh我遇到的脚本中,我发现了这些线条

#\
MAKE_LINTIAN_HAPPY '
Run Code Online (Sandbox Code Playgroud)

接近开始.

从标识符的名称,很清楚它为什么被添加.但我的问题是:为什么这个合法的代码以及它做了什么(如果有的话)?


我问的原因是它使得GNU的源代码突出显示在这个脚本上无用,因为它会将tick后的所有文件解释为字符串.如果我知道为什么它是合法的,可能建议编辑语言定义文件来解决这个问题.

我试图在man网页上搜索sh线索

$ man sh|grep "\W'\W"
Run Code Online (Sandbox Code Playgroud)

但是没有一场比赛似乎有帮助(虽然有很多比赛,所以我可能会错过它,如果它在那里).

我也不明白#\; 我不知道这是否与这个问题无关.(Vim将对后面的行进行语法着色#\作为注释,但是一个简单的测试表明它sh会执行以下行#\.)

这是脚本开头的扩展摘录:

#!/bin/sh
# [...]
#\
exec tclsh $0 -- "$@"

#\
MAKE_LINTIAN_HAPPY '

set PROG_VERSION "v1.27 17/06/2005"
Run Code Online (Sandbox Code Playgroud)

Har*_*ald 5

您正在查看的脚本实际上不是shell(sh,bash,dash等)脚本,而是tclsh脚本.当你启动它时,事实上,/ bin/sh首先启动.它执行的第一个命令是

exec tclsh $0 -- "$@"
Run Code Online (Sandbox Code Playgroud)

意思是它启动tclsh并将脚本文件传递给tclsh.现在tclsh开始解释脚本.它还有'#'作为行注释的开头,但与sh相反,如果行末尾被转义,则行注释可以扩展到下一行#\.

所以该MAKE_LINTIAN_HAPPY行不是tclsh的命令,它只是被忽略了.tclsh执行的第一个命令是set PROG_VERSION ....

我不知道林田.这一行可能正是让lintian"误解"文件内容只是文本的目的,因为否则它会认为它是一个sh脚本,并会对政策违规大声喊叫.