命令行中用于Bash的代码格式化程序/美化程序?

29

寻找一款用于 bash 代码的命令行代码格式化工具。它必须可配置并且最好可以从命令行使用。

我有一个在 bash 中的大项目,我需要在其中运用 Q。到目前为止,我很满意 Paul Lutus 编写的用 python 写成的程序(是他之前用 Ruby 写的版本的翻版)。

参见http://arachnoid.com/python/beautify_bash_program.html(此外还克隆到了这里:https://github.com/ewiger/beautify_bash)。

但如果存在任何其他可靠的替代工具,我希望了解一下。需求:它应该提供足够强大的性能和对处理/解析相当复杂的代码的行为。

PS:我认为全面解析 bash 代码通常很复杂,因为官方没有语言语法规则(但如果我对此错了,请纠正我)。

4个回答

17
您可以使用脚本命令"gg=G"在vim中实现 "整理整个文件格式" 的功能。

1
是的,它似乎足够健壮,所以它符合条件。 - Yauhen Yakimovich
@YauhenYakimovich 有没有办法通过Bash解释器自动格式化文件? - Lime
1
我刚试了一下,结果缩进不正确。根据vim的内部文档,它将通过“内部格式化函数|C-indenting|和|'lisp'|”过滤文本。(我没有设置equalprgindentexpr)。如果有必要,该文件具有.sh扩展名。 - Keith Thompson

17

你可以尝试使用shfmt。它实现了自己的 shell 解析器,包括 Bash 支持,因此比基于纯文本的工具更加健壮。

而且,解析器和打印机都作为 Go 包可用,所以编写一个 20 行的 Go 程序来操作或玩弄 shell 代码应该很容易。

请注意,我是这个工具的作者,所以建议可能有点偏见 :)


4
请添加一条注释,说明您是shfmt的作者。 - Jonas Stein
@DanielMartí 我在这里抄送了你 https://stackoverflow.com/questions/60153533/how-to-get-the-sh-formatter-up-and-running#60153533 - mtotowamkwe

4
我发现 type 内置函数会以格式化的方式打印函数。
#/usr/bin/env bash

source <(cat <(echo 'wrapper() {') - <(echo '}'));
type wrapper | tail -n +4 | head -n -1 | sed 's/^    //g'

https://github.com/bas080/flush


1
这可能是一个不错的解决方案,但它会删除shell脚本中的所有注释和空行。 - aicastell
"它可以删除所有的注释和空行" 对我来说是一个很好的功能... :-D - Potherca
1
可以简化为:. <( echo wrapper\(\){ ; cat ; echo } ) ; type wrapper | sed '1,/{/d; $d' # 我不会更改缩进,因为那可能会破坏引用的多行字符串。 - Martin Kealey
@MartinKealey,这很不错。不再需要头和尾了。为了修复缩进,我添加了 ... | sed '1,/{/d; $d;s/^ //g' - bas080

1

相反,Shell确实有严格的语法规则。它在ISO标准和Bash及其他Shell的文档中都有描述,并且在Bash源代码树中的shell.y文件中以正式术语进行了说明。

使其“困难”的是,在通常认为引用字符串是单个词汇单元的地方,在Shell中,每个元字符都是一个单独的词汇单元,因此字符的含义可能会根据其语法上下文而改变。

因此,解析标记与用户所想的“shell单词”不对齐,简单的引用字符串至少包含3个标记。

实现通常采用一些快捷方式,涉及使用多个词法分析器,这些分析器由语法是否在引号内、数字上下文内或两者之外选择。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接