wiki-js/sysadmin/Linux/Base-znaniy/Bat.md

210 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
title: Bat как замена для cat
description:
published: true
date: 2023-11-15T18:07:41.351Z
tags:
editor: markdown
dateCreated: 2023-11-15T18:07:37.064Z
---
![1.png](/attachments/base/1.png)
Знакомлю вас с утилитой командной строки, которая мне очень понравилась. Речь пойдёт про bat, аналоге cat, только с подсветкой синтаксиса и не только.
Лично я утилиту cat использую постоянно. Сформировалась привычка при поиске чего-то делать сначала cat, потом grep. Например:
`cat /var/log/messages | grep kernel`
По идее, логичнее и проще сделать так:
`egrep "kernel" /var/log/messages`
Но я привык к первому варианту и cat использую постоянно. И при грепанье, и просто при просмотре чего-то в консоли. Перед тем, как что-то скопировать из файла, вывожу через cat в консоль.
Bat очень классно подсвечивает вывод в консоли. Нет смысла рассказывать, на картинке к посту все и так видно:
`bat /etc/hosts`
Репозиторий утилиты - https://github.com/sharkdp/bat. В Debian/Ubuntu bat ставится из стандартных реп:
```
apt install bat
ln -s /usr/bin/batcat /usr/bin/bat
```
Если нет в репах, то качаем с репозитория и устанавливаем.
```
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-musl_0.18.2_amd64.deb
dpkg -i bat-musl_0.18.2_amd64.deb
```
В Centos 8 (на 7 не заработает из-за устаревших пакетов) и форках придется бинарник качать:
```
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
tar xzvf bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
cd bat-v0.18.2-x86_64-unknown-linux-gnu
cp bat /usr/bin/
```
________________________
Добавлю от себя, на centos вылетела ошибка
```
/lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./bat)
```
Поэтому пришлось найти решение вот такое.
```bash
#!/bin/sh
red=`tput setaf 1`
green=`tput setaf 2`
bold=`tput bold`
reset=`tput sgr0`
echo ""
echo "${bold}${green}Installing the latest CentOS release version of bat command from GitHub...${reset}"
echo ""
echo "${bold}Note${reset}: For more information, please see https://github.com/sharkdp/bat."
echo ""
echo "Finding the latest version tag from Github..."
BAT_VERSION=$(curl --silent "https://api.github.com/repos/sharkdp/bat/releases/latest" | grep -Eo '"tag_name": "v(.*)"' | sed -E 's/.*"([^"]+)".*/\1/')
BAT_RELEASE="bat-$BAT_VERSION-x86_64-unknown-linux-musl"
BAT_ARCHIVE="$BAT_RELEASE.tar.gz"
echo ""
echo "Version ${bold}$BAT_VERSION${reset} found, downloading ${bold}$BAT_ARCHIVE${reset} from GitHub..."
curl -sOL "https://github.com/sharkdp/bat/releases/download/$BAT_VERSION/$BAT_ARCHIVE"
echo ""
echo "Unarchiving ${bold}$BAT_ARCHIVE${reset} to ${bold}$HOME/$BAT_RELEASE${reset}..."
tar xzvf $BAT_ARCHIVE -C $HOME/
echo ""
echo "Copying executable to ${bold}/usr/local/bin/bat${reset}..."
sudo sh -c "cp $HOME/$BAT_RELEASE/bat /usr/local/bin/bat"
echo ""
echo "Removing ${bold}$BAT_ARCHIVE${reset} and cleaning up..."
rm $BAT_ARCHIVE
unset BAT_ARCHIVE
unset BAT_RELEASE
unset BAT_VERSION
if command -v bat &> /dev/null
then
echo ""
echo "${bold}${green}Finished installing $(bat --version).${reset}"
else
echo ""
echo "${bold}${red}Installation failed! Please examine this script and try steps manually.${reset}"
exit 1
fi
```
Знакомлю вас с утилитой командной строки, которая мне очень понравилась. Речь пойдёт про bat, аналоге cat, только с подсветкой синтаксиса и не только.
Лично я утилиту cat использую постоянно. Сформировалась привычка при поиске чего-то делать сначала cat, потом grep. Например:
`cat /var/log/messages | grep kernel`
По идее, логичнее и проще сделать так:
`egrep "kernel" /var/log/messages`
Но я привык к первому варианту и cat использую постоянно. И при грепанье, и просто при просмотре чего-то в консоли. Перед тем, как что-то скопировать из файла, вывожу через cat в консоль.
Bat очень классно подсвечивает вывод в консоли. Нет смысла рассказывать, на картинке к посту все и так видно:
`bat /etc/hosts`
Репозиторий утилиты - https://github.com/sharkdp/bat. В Debian/Ubuntu bat ставится из стандартных реп:
```
apt install bat
ln -s /usr/bin/batcat /usr/bin/bat
```
Если нет в репах, то качаем с репозитория и устанавливаем.
```
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-musl_0.18.2_amd64.deb
dpkg -i bat-musl_0.18.2_amd64.deb
```
В Centos 8 (на 7 не заработает из-за устаревших пакетов) и форках придется бинарник качать:
```
wget https://github.com/sharkdp/bat/releases/download/v0.18.2/bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
tar xzvf bat-v0.18.2-x86_64-unknown-linux-gnu.tar.gz
cd bat-v0.18.2-x86_64-unknown-linux-gnu
cp bat /usr/bin/
```
________________________
Добавлю от себя, на centos вылетела ошибка
```
/lib64/libc.so.6: version `GLIBC_2.18' not found (required by ./bat)
```
Поэтому пришлось найти решение вот такое.
```bash
#!/bin/sh
red=`tput setaf 1`
green=`tput setaf 2`
bold=`tput bold`
reset=`tput sgr0`
echo ""
echo "${bold}${green}Installing the latest CentOS release version of bat command from GitHub...${reset}"
echo ""
echo "${bold}Note${reset}: For more information, please see https://github.com/sharkdp/bat."
echo ""
echo "Finding the latest version tag from Github..."
BAT_VERSION=$(curl --silent "https://api.github.com/repos/sharkdp/bat/releases/latest" | grep -Eo '"tag_name": "v(.*)"' | sed -E 's/.*"([^"]+)".*/\1/')
BAT_RELEASE="bat-$BAT_VERSION-x86_64-unknown-linux-musl"
BAT_ARCHIVE="$BAT_RELEASE.tar.gz"
echo ""
echo "Version ${bold}$BAT_VERSION${reset} found, downloading ${bold}$BAT_ARCHIVE${reset} from GitHub..."
curl -sOL "https://github.com/sharkdp/bat/releases/download/$BAT_VERSION/$BAT_ARCHIVE"
echo ""
echo "Unarchiving ${bold}$BAT_ARCHIVE${reset} to ${bold}$HOME/$BAT_RELEASE${reset}..."
tar xzvf $BAT_ARCHIVE -C $HOME/
echo ""
echo "Copying executable to ${bold}/usr/local/bin/bat${reset}..."
sudo sh -c "cp $HOME/$BAT_RELEASE/bat /usr/local/bin/bat"
echo ""
echo "Removing ${bold}$BAT_ARCHIVE${reset} and cleaning up..."
rm $BAT_ARCHIVE
unset BAT_ARCHIVE
unset BAT_RELEASE
unset BAT_VERSION
if command -v bat &> /dev/null
then
echo ""
echo "${bold}${green}Finished installing $(bat --version).${reset}"
else
echo ""
echo "${bold}${red}Installation failed! Please examine this script and try steps manually.${reset}"
exit 1
fi
```