Действительно ли возможно ввести новые строки в ouput cowsay/cowthink при сохранении “пузыря”?

Можно использовать -k переключитесь для нахождения всех страниц справочника, которые содержат wh или на их имя или на их краткие описания. Затем просто grep для тех, которые запускаются с wh. Команда apropos эквивалентно man -k.

Пример

$ man -k wh | grep "^wh"
what (1p)            - identify SCCS files (DEVELOPMENT)
whatis (1)           - display manual page descriptions
whereis (1)          - locate the binary, source, and manual page files for a command
which (1)            - shows the full path of (shell) commands.
while (n)            - Execute script repeatedly as long as a condition is met
whiptail (1)         - display dialog boxes from shell scripts
whirlwindwarp (6x)   - crazy moving stars
whline (3x)          - create curses borders, horizontal and vertical lines
whline_set (3x)      - create curses borders or lines using complex characters and renditions
who (1)              - show who is logged on
who (1p)             - display who is on the system
whoami (1)           - print effective userid
whois (1)            - client for the whois service

Поиск страниц справочника

Если Вы полны решимости перерыть страницы справочника, делающие полнотекстовый поиск, можно использовать -K переключатель. Это - верхний регистр K.

Пример

$ man -w -K symbolic | head -10
/usr/local/share/man/man1/mimeopen.1
/usr/local/share/man/man1/mimetype.1
/usr/local/share/man/man1/ptksh.1
/usr/share/man/man1/as.1.gz
/usr/share/man/man1/atop.1.gz
/usr/share/man/man1/atopsar.1.gz
/usr/share/man/man1/attr.1.gz
/usr/share/man/man1/autoreconf.1.gz
/usr/share/man/man1/bakefilize.1.gz
/usr/share/man/man1/bash.1.gz

Этот метод не дает Вам название страницы справочника, ни краткого описания все же. Это только показывает Вам подлинное имя файла, что страница справочника хранится в, который обычно является названием команды.

3
13.04.2017, 15:37
3 ответа

Это не проблема cowsay. Это то, как shell работает с новыми строками в параметрах: Они рассматриваются как любые пробельные символы. Попробуйте echo $(ls): Все файлы выводятся в одну строку, хотя ls выводит новые строки.

К счастью, вы можете передавать данные в cowsay через stdin:

(echo "header line"; links ...; links ...; links...) | \
    cowsay -W80 -f bud-frogs
1
27.01.2020, 21:16

Обдумав ответ, я смог сделать то, что хотел сделать в первую очередь, добавив последовательности новых строк и передав все это в stdin 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 |
       |:_/ |
      //   \ \
     (|     | )
    /'\_   _/`\
    \___)=(___/
1
27.01.2020, 21:16

Чтобы сделать красивый пузырь, cowsay по умолчанию обрезает все пробелы. Это подразумевает разрывы строк. Если вы передаете два разрыва строки подряд, cowsay напечатает их оба.

Попробуйте

cowsay "lala
lala"

против

cowsay "lala

lala"

Первый выведет lala lalaво всплывающем окне, второй выведет

lala

lala

Это поведение не связано с оболочкой, это просто шутка:)

Если вам это не нравится, вам нужен переключатель -n. Он полностью предотвращает перенос слов и, следовательно, позволяет использовать произвольные пробельные символы.

К сожалению, следующая команда не работает как исключение:

cowsay -n "lala
lala"

Потому что в моей версии cowsay не позволяет передавать сообщение в качестве аргумента, пока указана опция -n. Но

echo "lala
lala" | cowsay -n

работает как заклинание.

Итак, для вашей проблемы, если вам не нравится двойной \n в вашем выводе, измените команду на

(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
4
27.01.2020, 21:16

Теги

Похожие вопросы