【发布时间】:2010-10-21 12:25:01
【问题描述】:
我正在寻找与indent 类似的东西,但用于(bash)脚本。仅控制台,无着色等。
你知道一个吗?
【问题讨论】:
-
也可以考虑把你的答案放在this more general question
标签: bash scripting shell indentation
我正在寻找与indent 类似的东西,但用于(bash)脚本。仅控制台,无着色等。
你知道一个吗?
【问题讨论】:
标签: bash scripting shell indentation
bash5+ 有一个 --pretty-print 选项。但它会删除 cmets,包括第一行的 '#!/bin...'
【讨论】:
在 bash 中我这样做:
reindent() {
source <(echo "Zibri () {";cat "$1"; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3 | sed -e "s/^\s\s\s\s//"
}
这消除了 cmets 并重新缩进脚本“bash 方式”。
如果您的脚本中有 HEREDOCS,它们会被前一个函数中的 sed 破坏。
所以使用:
reindent() {
source <(echo "Zibri () {";cat "$1"; echo "}")
declare -f Zibri|head --lines=-1|tail --lines=+3"
}
但是你所有的脚本都会有 4 个空格的缩进。
或者你可以这样做:
reindent ()
{
rstr=$(mktemp -u "XXXXXXXXXX");
source <(echo "Zibri () {";cat "$1"|sed -e "s/^\s\s\s\s/$rstr/"; echo "}");
echo '#!/bin/bash';
declare -f Zibri | head --lines=-1 | tail --lines=+3 | sed -e "s/^\s\s\s\s//;s/$rstr/ /"
}
它也照顾 heredocs。
【讨论】:
tr "ZZ" "\n\n"之前和之后再做一个tr "\n\n" "ZZ"(但有一百万种方法)
shfmt 效果很好。
您可以格式化 bash 脚本,也可以通过预提交挂钩检查格式。
# reformat
shfmt -l -w script.sh
# check if the formatting is OK
shfmt -d script.sh
# works on the whole directory as well
shfmt -l -w .
唯一缺少的选项是它不会根据行长重新格式化 (yet)。
由于它是用 go 编写的,因此您可以下载适用于大多数平台的二进制文件,例如对于特拉维斯(.travis.yml):
install:
- curl -LsS -o ~/shfmt https://github.com/mvdan/sh/releases/download/v3.1.2/shfmt_v3.1.2_linux_amd64
- chmod +x ~/shfmt
script:
- ~/shfmt -d .
npm 上还有一个交叉编译的 js 版本和很多编辑器插件(见related projects)
【讨论】:
Vim 可以缩进 bash 脚本。但在缩进之前不要重新格式化它们。
备份你的 bash 脚本,用 vim 打开它,输入gg=GZZ 并且缩进将被纠正。 (不耐烦的注意:这会覆盖文件,所以一定要备份!)
不过,<< 的一些错误(期望 EOF 作为一行的第一个字符)例如
编辑:ZZ 不是 ZQ
【讨论】:
cp -p $script{,.$(date -Is)} 备份会留下一个可以diff -cw 对抗的文件,这表明该解决方案可以很好地对抗我测试过的相当复杂的shell 脚本。 (不过这里没有<< 文本)