【问题标题】:Adding spaces to stdout向标准输出添加空格
【发布时间】:2015-08-09 21:36:18
【问题描述】:

当我在 bash shell 脚本中运行命令时,是否可以在每个输出左侧添加空格到 stdout(如果可能,还可以添加到 stderr)?

我想做这样的事情:

#!/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 命令中添加引号,否则不会被填充。

【问题讨论】:

  • 是否没有可以应用的通用终端设置,例如,我们可以更改std::out/err 的字体颜色以及所有内容,是否有一些东西可以将n ``空格在“〜$”之后??然后当我们退出我们重置的脚本时。

标签: bash


【解决方案1】:

是的,你可以引用它们来做一些简单的事情:

echo '    => installing prerequisite1'

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

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

2>&1 将 stdout 和 stderr 放到 stdout 流中,sed 用三个空格替换每个行首标记。

这在 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*

这将通过sed 重新运行带有缩进的脚本,如果它还没有这样做的话。这样,您不必担心更改所有输出语句。我知道这有点 hack,但我倾向于只做快速而肮脏的 shell 脚本所必需的事情。

【讨论】:

  • 我可以使用 wget -q 来省略输出。但我想你的想法很酷。我会试试看。谢谢!
  • 来自wget(1),关于进度条:“如果输出不是TTY,默认使用‘点’条。”我试了一下,效果很好。感谢您的巧妙技巧。
【解决方案2】:

如果要打开和关闭间距,请使用以下 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.

do-stuff 是你的 bash 脚本,magic-spacing 是我上面的 awk 脚本。

【讨论】:

  • 是否可以通过执行 /usr/bin/gawk -F
  • @kolrie - 你可以,但你需要将标准输出重定向到嵌入的 awk sn-p。也许通过将主体放入一个函数,然后将函数的输出重定向到 sn-p?
【解决方案3】:

根据命令写入标准输出的方式,您可以使用简单的 awk 脚本缩进:

$ echo -e 'hello\nworld' | awk '{print "    ",$0}'
     hello
     world

【讨论】:

    【解决方案4】:

    您可以使用 printf 执行以下操作:

    # 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】:

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

      ( 
      exec 1>&2
      command ls -ld * 
      ) 2>&1 | sed 's/^/    /'
      

      【讨论】:

        【解决方案6】:

        使用 python pyp(The Pyed Piper):

        ls -ld | pyp "'    '+p"
        

        【讨论】:

        • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
        猜你喜欢
        • 2020-01-03
        • 2020-07-01
        • 2019-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多