--- 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 ```