【问题标题】:Is there a linter for fish like there is for bash with shellcheck?是否有像带有 shellcheck 的 bash 那样的鱼短绒?
【发布时间】:2017-03-07 23:35:27
【问题描述】:

对于 sh/bash/zsh,有 https://github.com/koalaman/shellcheck,但它不会支持鱼 https://github.com/koalaman/shellcheck/issues/209 - 有鱼的短绒吗?

【问题讨论】:

  • Faho 已经提供了一个很好的答案,但我想指出 fish 有一个 fish_indent 命令,它利用 fish 解析器来处理鱼代码,就像 gofmt 这样的工具对 go-lang 和clang-format 适用于 C/C++。该工具可以构成fish_lint 命令的基础。鼓励任何有足够动力的人卷起袖子编写代码来实现这样的命令。

标签: debugging fish


【解决方案1】:

据我所知,没有(显然这不可能证明)。

如果有人要创建这样的东西,则需要就“典型的初学者语法问题”和“导致 shell 行为异常和违反直觉的语义问题”达成共识。

Fish 没有很多 POSIX sh 的疣(因为它是作为对它们的反应而写的)。来自shellcheck README的一些例子:

echo $1                           # Unquoted variables

Fish 的引用行为完全不同 - 特别是,变量没有分词,所以未引用的变量通常会做你想做的事。

v='--verbose="true"'; cmd $v      # Literal quotes in variables

这大概是一个(不成功的)试图击败分词,这不是必需的。

这个例子很好地说明了这个问题 - 有数十年的价值 sh 脚本。缺陷和不直观的行为是众所周知的。事实上,众所周知,常见但不正确的解决方法也是众所周知的。鱼的情况并非如此。

(显然,其他示例也适用于鱼,尤其是“经常误用的命令”部分。)


我知道新用户经常绊倒的鱼的一些东西:

  • 未加引号的变量扩展为列表中每个元素一个参数(因为每个变量都是一个)。如果列表为空,则包括零,这是test 的问题 - 例如test -n $var 将返回 0,因为 fish 的内置测试是与 POSIX 兼容的少数部分之一(因为 POSIX 要求使用一个参数进行测试返回 0)。如果您总是需要一个参数,请使用双引号。

  • {} 扩展为空,{x} 扩展为“x”,这意味着 find -exec 需要引用,一些 git commit-ishes (HEAD@{4}) 也是如此。

【讨论】:

  • 作者有幽默感。嘘! :D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2010-10-11
  • 2021-06-22
相关资源
最近更新 更多