É possível injetar novas linhas na saída do cowsay / cowthink enquanto preserva a “bolha”?

2

Eu mantenho uma versão impressa do manual Bash útil, por isso estou curioso sobre quaisquer alterações feitas para isso - especialmente porque eu nem sempre presto atenção nos pacotes que eu atualizo. Normalmente, você tem a versão do manual relacionada à versão do software que possui e você pode acompanhar alterações facilmente.

Eu construí isso para verificar algumas fontes e ter um resumo:

#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates

header="BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www)"
data="$(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*' | cut -d ' ' -f 4,6,9) -- $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}') -- $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*' | cut -d ' ' -f 3-)"

cowthink -W80 -f bud-frogs --  $header $data

Ele usa links e zcat para examinar uma sequência específica na fonte manpages on-line e localmente, bem como na seção / doc do repositório Bash e, finalmente, no manual de referência on-line. E a saída é assim:

( BASH manual -- Local BASH manual -- BASH repo /doc -- BASH Reference man(www) )
( Feb 2 2014 -- Feb 2 2014 -- 2014-02-26 -- August 22, 2012                     )
 ------------------------------------------------------------------------------- 
     o
      o
          oO)-.                       .-(Oo
         /__  _\                     /_  __\
         \  \(  |     ()~()         |  )/  /
          \__|\ |    (-___-)        | /|__/
          '  '--'    =='-'==        '--'  '

Ainda assim, gostaria de ter pares de itens e datar cada um deles em uma linha, assim:

BASH manual: Feb 2 2014
Local BASH manual: Feb 2 2014
BASH repo /doc: 2014-02-26
BASH Reference man(www): August 22, 2012

Mas para isso eu precisaria mudar de linha depois de concatenar o item e sua data - e não posso fazer isso com cowsay/cowthink . E isso explica porque eu projetei o roteiro como ele é. As duas variáveis estão lá apenas para me ajudar com a formatação, mas não têm nenhuma influência na execução. Acontece que as variáveis de cabeçalho e dados têm menos de 80 colunas de largura cada e a saída de comando é definida para 80 colunas para essa finalidade. Também usei cut para encurtar as datas para exibição em uma linha, em vez de usar apenas grep -o , como eu estava fazendo inicialmente. Eu usei arbitrariamente alguns caracteres (traços duplos) para formatação - o que é simples.

Você pode usar novas linhas com algo como cowsay ? Existe uma maneira (melhor) de fazer isso?

    
por Community 01.06.2014 / 03:13

3 respostas

1

Isto não é um problema com o cowsay. É como os shells lidam com as novas linhas nos parâmetros: eles são tratados como qualquer espaço em branco. Experimente echo $(ls) : Todos os arquivos são enviados em uma única linha, mesmo que ls produza novas linhas.

Felizmente, você pode passar dados para o cowsay via stdin:

(echo "header line"; links ...; links ...; links...) | \
    cowsay -W80 -f bud-frogs
    
por 01.06.2014 / 08:49
1

Depois de considerar a resposta, eu pude fazer o que eu queria fazer em primeiro lugar adicionando sequências de nova linha e passando a coisa toda para stdin de cowthink:

#!/usr/bin/env bash
## bashmancheck - Check different sources for date of the last updates

(echo -e "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')\n"; echo -e "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')\n"; echo -e "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')\n"; echo -e "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -W80 -f tux

 ______________________________________________________________ 
( BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014       )
(                                                              )
( Local BASH manual - Last Change: Sun Feb 2 16:21:40 EST 2014 )
(                                                              )
( BASH repo /doc: 2014-02-26                                   )
(                                                              )
( BASH Reference man(www): last updated August 22, 2012        )
 -------------------------------------------------------------- 
   o
    o
        .--.
       |o_o |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/'\
    \___)=(___/
    
por 01.06.2014 / 21:47
1

Para fazer a bolha legal, o cowsay apara todos os espaços em branco por padrão. Isso implica em quebras de linha. Se você passar duas quebras de linha seguidas, cowsay imprime as duas.

Tente

cowsay "lala
lala"

vs.

cowsay "lala

lala"

O primeiro produzirá lala lala em uma bolha, a última sairá

lala

lala

Este não é um comportamento relacionado ao shell, isso é apenas cowsay:)

Se você não gostar disso, precisará da opção -n . Evita completamente a quebra automática de palavras e, portanto, permite caracteres arbitrários em espaços em branco.

Infelizmente, o seguinte comando não funciona como exceção:

cowsay -n "lala
lala"

Porque o cowsay na minha versão não permite passar uma mensagem como argumento enquanto a opção -n é dada. Mas

echo "lala
lala" | cowsay -n

funciona como um encanto.

Então, para o seu problema, se você não gosta do dobro \ n em sua saída, altere o comando para

(echo "BASH manual - $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/tree/doc/bash.1' | grep -om 1 'Last Change.*')"; echo "Local BASH manual - $(zcat /usr/share/man/man1/bash.1.gz | grep -om 1 'Last Change.*')"; echo "BASH repo /doc: $(links -dump 'http://git.savannah.gnu.org/cgit/bash.git/log/doc' | grep -Eom 1 '[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}')"; echo "BASH Reference man(www): $(links -dump 'http://www.gnu.org/software/bash/manual' | grep -om 1 'last updated.*')") \
| cowthink -f tux -n
    
por 30.01.2019 / 11:00

Tags