【问题标题】:What does MAKE_LINTIAN_HAPPY and a single quote in a shell script do?MAKE_LINTIAN_HAPPY 和 shell 脚本中的单引号有什么作用?
【发布时间】:2014-01-04 16:46:33
【问题描述】:

在我遇到的sh 脚本中,我找到了这些行

#\
MAKE_LINTIAN_HAPPY '

接近开头。

从标识符的名称中,很清楚为什么要添加它。但是我的问题是:为什么这个 sh 代码是合法的,它有什么作用(如果有的话)?


我问的原因是它在此脚本上呈现GNU's source-highlight 无用,因为它会将勾选后的所有文件解释为字符串。如果我知道为什么它是合法的,可能会建议对语言定义文件进行编辑以解决此问题。

我尝试在 man 页面中搜索 sh 以寻找线索

$ man sh|grep "\W'\W"

但所有匹配项似乎都没有帮助(虽然有很多匹配项,所以如果有的话我可能会错过)。

我也不懂#\;我不知道这是否与这个问题无关。 (Vim 会将#\ 之后的行作为注释进行语法着色,但一个简单的测试表明sh 确实执行了#\ 之后的行。)

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

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

#\
MAKE_LINTIAN_HAPPY '

set PROG_VERSION "v1.27 17/06/2005"

【问题讨论】:

  • "Lintian 是一个辅助工具,与 Debian 软件包管理系统 dpkg 一起使用。"见lintian.debian.org。祝你好运。
  • 有以前的' 吗?
  • 如果删除MAKE_LINTIAN_HAPPY 行,lintian 会产生什么样的警告?
  • @karoly-horvath:我不知道什么警告,我从未使用过 lintian。不 - 有问题的行上的 ' 是文件中第一次出现的 '。
  • 好吧,如果你有兴趣,你应该检查一下。并且...有结束语吗?

标签: linux shell sh


【解决方案1】:

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

exec tclsh $0 -- "$@"

意味着它会启动 tclsh 并将脚本文件传递给 tclsh。现在 tclsh 开始解释脚本。它也有 '#' 作为行注释的开头,但与 sh 相比,行注释可以扩展到下一行,如果行尾被转义,因此 #\

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

我不认识林天。这一行的目的可能正是让 lintian 将文件的内容“误解”为文本,否则它会认为这是一个 sh 脚本,并且会大声嚷嚷违反政策。

【讨论】:

  • +1 很好的分析。最后一段似乎完全合理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 2018-02-14
  • 2012-03-16
  • 1970-01-01
  • 2012-06-16
相关资源
最近更新 更多