Pretty-print for shell script

前端 未结 4 2137
小蘑菇
小蘑菇 2020-12-31 17:35

I\'m looking for something similiar to indent but for (bash) scripts. Console only, no colorizing, etc.

Do you know of one ?

相关标签:
4条回答
  • 2020-12-31 18:14

    In bash I do this:

    reindent() {
    source <(echo "Zibri () {";cat "$1"; echo "}")
    declare -f Zibri|head --lines=-1|tail --lines=+3 | sed -e "s/^\s\s\s\s//"
    }
    

    this eliminates comments and reindents the script "bash way".

    If you have HEREDOCS in your script, they got ruined by the sed in the previous function.

    So use:

    reindent() {
    source <(echo "Zibri () {";cat "$1"; echo "}")
    declare -f Zibri|head --lines=-1|tail --lines=+3"
    }
    

    But all your script will have a 4 spaces indentation.

    Or you can do:

    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/    /"
    }
    

    which takes care also of heredocs.

    0 讨论(0)
  • 2020-12-31 18:21

    Vim can indent bash scripts. But not reformat them before indenting.
    Backup your bash script, open it with vim, type gg=GZZ and indent will be corrected. (Note for the impatient: this overwrites the file, so be sure to do that backup!)

    Though, some bugs with << (expecting EOF as first character on a line) e.g.

    EDIT: ZZ not ZQ

    0 讨论(0)
  • bash5+ has a --pretty-print option.. it will remove comments though, including a first-line '#!/bin...'

    0 讨论(0)
  • 2020-12-31 18:29

    shfmt works very well.

    You can format bash scripts and also check the formatting from pre-commit hooks.

    # 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 .
    

    The only option absent is that it does not reformat according to line length (yet).

    Since it is written in go you can just download the binary for most platforms, e.g. for Travis (.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 .
    

    There is also a cross compiled js version on npm and a lot of editor plugins (see related projects)

    0 讨论(0)
提交回复
热议问题