【问题标题】:Pretty-print for shell scriptshell脚本的漂亮打印
【发布时间】:2010-10-21 12:25:01
【问题描述】:

我正在寻找与indent 类似的东西,但用于(bash)脚本。仅控制台,无着色等。

你知道一个吗?

【问题讨论】:

标签: bash scripting shell indentation


【解决方案1】:

bash5+ 有一个 --pretty-print 选项。但它会删除 cmets,包括第一行的 '#!/bin...'

【讨论】:

    【解决方案2】:

    在 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 实现不喜欢直接的 urandom... cat /dev/urandom | base64 可以很好地替代......谢谢
    • 最后一个对我不起作用,bash 抱怨。此外,空行会丢失。
    • 是的,空行丢失了..但可以为此修改...我不需要它。
    • 你可以在tr "ZZ" "\n\n"之前和之后再做一个tr "\n\n" "ZZ"(但有一百万种方法)
    • @BrianChrisman 或者您可以只输入一个静态随机字符串...它不能出现在代码中...我使用了一个随机字符串,因此 reindent 可以重新缩进自身:D
    【解决方案3】:

    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

    【讨论】:

      【解决方案4】:

      Vim 可以缩进 bash 脚本。但在缩进之前不要重新格式化它们。
      备份你的 bash 脚本,用 vim 打开它,输入gg=GZZ 并且缩进将被纠正。 (不耐烦的注意:这会覆盖文件,所以一定要备份!)

      不过,&lt;&lt; 的一些错误(期望 EOF 作为一行的第一个字符)例如

      编辑:ZZ 不是 ZQ

      【讨论】:

      • 使用cp -p $script{,.$(date -Is)} 备份会留下一个可以diff -cw 对抗的文件,这表明该解决方案可以很好地对抗我测试过的相当复杂的shell 脚本。 (不过这里没有&lt;&lt; 文本)
      猜你喜欢
      • 2010-09-26
      • 1970-01-01
      • 2011-03-23
      • 2016-01-12
      • 2021-08-03
      • 2012-02-27
      • 2021-06-22
      • 1970-01-01
      • 2016-07-07
      相关资源
      最近更新 更多