代码之家  ›  专栏  ›  技术社区  ›  kolrie

向标准输出添加空格

  •  9
  • kolrie  · 技术社区  · 14 年前

    我想做一些类似的事情:

    #!/bin/bash
    echo Installing: Something
    echo "    => installing prerequisite1"
    
    ## INSERT MAGICAL LEFT SPACES COMMAND HERE ##
    
    apt-get install -q -y prerequisite
    
    ## ANOTHER MAGICAL CANCELLING LEFT SPACES COMMAND HERE ##
    
    echo "    => installing prerequisite2"
    # ... the padding again ...
    wget http://abc.com/lostzilla.tar.gz
    tar vzxf lostzilla.tar.gz
    cd lostzilla-1.01
    ./configure
    make && make install
    # ... end of padding ...
    
    echo Done.
    

    你知道吗?

    编辑: 在echo命令中添加引号,否则它们将不会被填充。

    6 回复  |  直到 14 年前
        1
  •  13
  •   paxdiablo    14 年前

    是的,你可以引用它们来描述简单的事情:

    echo '    => installing prerequisite1'
    

    通过管道输出 sed 对于复杂的事情:

    tar vzxf lostzilla.tar.gz 2>&1 | sed 's/^/   /'
    

    2>&1 将stdout和stderr放到stdout流和 塞德

    这对像这样的事情有多好 wget 我不确定它能做各种各样的光标操作。

    示例如下:

    pax> ls -1 p*
    phase1.py
    phase1.sh
    phase2.py
    phase2.sh
    primes.c
    primes.exe
    primes.sh
    primes.stat
    
    pax> ls -1 p* | sed 's/^/   /'
       phase1.py
       phase1.sh
       phase2.py
       phase2.sh
       primes.c
       primes.exe
       primes.sh
       primes.stat
    

    我在过去使用的一个技巧是确保脚本本身处理缩进:

    #!/bin/bash
    if [[ "${DONT_EVER_SET_THIS_VAR}" = "" ]] ; then
            export DONT_EVER_SET_THIS_VAR=except_for_here
            $0 | sed 's/^/   /'
            exit
    fi
    ls -1 p*
    

    这将通过缩进重新运行脚本 塞德

        2
  •  4
  •   bstpierre Edgar Aviles    14 年前

    如果要打开和关闭间距,请使用以下awk脚本:

    #!/usr/bin/gawk -f
    
    /^#SPACEON/ { spaces=1; }
    /^#SPACEOFF/ { spaces=0; }
    !/^#SPACE/ { 
        if(spaces) {
            print "    " $0;
        } else {
            print $0;
        }
    }
    

    注意,bash scipt有一些小问题。值得注意的是,使用 => 在您的echo语句中将输出字符 = 文件“正在安装”。

    #!/bin/bash
    
    echo Installing: Something
    echo '=> installing prerequisite1'
    
    echo '#SPACEON'
    
    echo You would see apt-get install -q -y prerequisite
    
    echo '#SPACEOFF'
    echo '=> installing prerequisite2'
    echo '#SPACEON'
    
    
    echo You would see wget http://abc.com/lostzilla.tar.gz
    echo You would see tar vzxf lostzilla.tar.gz
    echo You would see cd lostzilla-1.01
    echo You would see ./configure
    echo You would see make \&\& make install
    
    echo '#SPACEOFF'
    echo Done.
    

    将两者结合起来可以:

    $ ./do-stuff | ./magic-spacing 
    Installing: Something
    => installing prerequisite1
        You would see apt-get install -q -y prerequisite
    => installing prerequisite2
        You would see wget http://abc.com/lostzilla.tar.gz
        You would see tar vzxf lostzilla.tar.gz
        You would see cd lostzilla-1.01
        You would see ./configure
        You would see make && make install
    Done.
    

    哪里做东西是你的bash脚本和魔术间距是我的awk脚本上面。

        3
  •  3
  •   Mark Rushakoff    14 年前

    根据命令写入stdout的方式,您可以使用一个简单的awk脚本缩进:

    $ echo -e 'hello\nworld' | awk '{print "    ",$0}'
         hello
         world
    
        4
  •  1
  •   yabt    14 年前

    # space padding for single string
    printf "%-4s%s\n" "" "=> installing prerequisite1"
    
    # space padding for single command output
    # use of subshell leaves original IFS intact
    ( IFS=$'\n'; printf "    %s\n" $(command ls -ld * 2>&1) )
    
    # note: output to stderr is unbuffered
    ( IFS=$'\n'; printf "    %s\n" $(command ls -ld * 1>&2) )
    

    也可以通过将命令用大括号括起来并用空格填充其输出来对命令进行分组,如下所示:

    {
    cmd1 1>&2
    cmd2 1>&2
    cmd3 1>&2
    } 2>&1 | sed 's/.*/    &/'
    
        5
  •  0
  •   tom    14 年前

    可以使用exec将stdout重定向到stderr脚本/shell范围。。。

    ( 
    exec 1>&2
    command ls -ld * 
    ) 2>&1 | sed 's/^/    /'
    
        6
  •  0
  •   spongebob    9 年前

    使用python pyp(Pyed Piper):

    ls -ld | pyp "'    '+p"