Лучшее решение, которое я мог бы придумать для того, что вы думаете вы хотите, - это добавить это к вашему .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
.