перенаправить весь вывод на lolcat - PullRequest
0 голосов
/ 24 января 2020

Я недавно нашел про lolcat. Мне так понравилось, потому что я хочу перенаправить весь свой вывод через lolcat. В терминале это может быть достигнуто с помощью

ls -lh | lolcat

Это выведет цвет. Если я хочу сделать это снова для всех команд, скажем, для

cat /filename.sh | lolcat

Если я хочу сделать этот перманент и сделать псевдоним и pu sh это мой .bashrc файл

cat='cat |lolcat'

Это запустится, но мне нужно написать много псевдонимов для загрузки команд.

Все, что я знаю, это то, что я могу перехватывать входы терминала и заменять inline, используя $ 1 , $ 2 и так далее, но я хочу, чтобы он был надежным только в одном месте, который также может заменить все остальные команды.

Ответы [ 3 ]

2 голосов
/ 24 января 2020

Лучшее решение, которое я мог бы придумать для того, что вы думаете вы хотите, - это добавить это к вашему .bashrc:

lol()
{
    if [ -t 1 ]; then
        "$@" | lolcat
    else
        "$@"
    fi
}

bind 'RETURN: "\e[1~lol \e[4~\n"'

Функция lol() принимает любые команда, выполняет его и направляет свой стандартный вывод в lolcat , если стандартный вывод является терминалом.

Вы можете запустить lol ls, и он будет передавать ls в lolcat.

Команда bind сообщает readline, библиотека bash использует для чтения ввода, чтобы вести себя иначе, когда вы нажимаете Enter в bash.

Обычное поведение - просто вставить \n.

Эта команда (бессовестно похищенная из этого ответа ) приведет к тому, что Enter наберет go в начале строки, введет текст lol, а затем go в конце и только потом вставьте \n.

Если вы используете это, вы увидите в терминале, как ваши команды имеют префикс lol.

Вы быстро обнаружите что это довольно раздражает. Поскольку вы перенаправляете что-то, то все перестает работать.

Например, с этим man ls не открывается в пейджере, потому что man обнаруживает, что stdout - это не терминал, а канал. И даже не пытайтесь использовать vim.

Другая проблема состоит в том, что вы наберете ls, и оно превратится в lol ls, а затем, когда вы нажимаете клавишу Up, чтобы получить последнюю команду и нажмите Enter, он превратится в lol lol ls.

Суть в том, что вы хотите указать c о командах, которые вы перенаправляете, и сможете запускать исходные команды, Имея это в вашем .bashrc:

lol()
{
    if [ -t 1 ]; then
        "$@" | lolcat
    else
        "$@"
    fi
}

COMMANDS=(
    ls
    cat
)

for COMMAND in "${COMMANDS[@]}"; do
    alias "${COMMAND}=lol ${COMMAND}"
    alias ".${COMMAND}=$(which ${COMMAND})"
done

Функция lol() такая же, как и раньше, за исключением того, что теперь массив COMMANDS содержит все команды (arguments-agnosti c), которые вы можете redirect.

Например, ls /usr будет действительно запускать lol ls /usr, но запуск .ls /usr будет запускать /bin/ls /usr.

2 голосов
/ 24 января 2020

Скорее всего, вы не хотите создавать отдельные псевдонимы для команд, поскольку это может повлиять на работу каналов, сценариев и т. Д. c, которые будут неявно использовать такие команды, как cat, ls.

Кроме того, помните, что некоторые команды имеют visual характер (vi, emacs, info) и, вероятно, будут иметь проблемы, если выходные данные будут проходить через фильтр lolcat.

потенциальные проблемы и сосредоточение на том, как реализовать: Рассмотрите возможность перенаправления всех выходных данных через фильтр lolcat и исключения (нескольких) визуальных команд из перенаправления. Последовательность сохранения текущего стандартного вывода (терминала) в fd # 3.

alias vi 'vi >&3'
alias emacs `emacs >&3'
...
exec 3>&1 > >(lolcat)
0 голосов
/ 24 января 2020

Вся заслуга в принятом ответе. Я просто извлекаю, каково решение для будущего искателя, такого как я.

 lol()
 {
   if [ -t 1 ]; then
       "$@" | lolcat
   else
       "$@"
   fi
 }

Одного этого достаточно для моей проблемы. Я могу использовать команду lol function +, если я хочу сделать вывод цветным с помощью lolcat

В приведенном ниже примере все команды, упомянутые в переменной COMMANDS , по умолчанию будут окрашены.

 COMMANDS=(
           ls
           cat
           )

 for COMMAND in "${COMMANDS[@]}"; do
    alias "${COMMAND}=${COMMAND} | lolcat"
    alias ".${COMMAND}=$(which ${COMMAND})"
 done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...