ASCII-баннер в терминале: bash, zsh, fish, PowerShell и вход по SSH
Используйте heredoc в кавычках или файл, чтобы сохранить обратные слеши, и выводите баннер только в интерактивных оболочках, чтобы не сломать scp.
Баннер с вашим именем или именем машины при каждом открытии терминала — приятная деталь, к тому же сразу видно, на каком вы компьютере. В этом руководстве показано, как добавить баннер, созданный на lab.ascii, в файлы запуска вашей оболочки.
В примерах используется «DEV» шрифтом Small. В нём есть обратные слеши (\), так что вы сразу заметите, если он испортится.
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
Сначала две важные вещи
Сохраните обратные слеши
Если выводить баннер через echo "...", оболочка считает \ и $ специальными символами, и части арта могут пропасть или измениться. Используйте один из вариантов:
- Heredoc в кавычках: возьмите конечный маркер в кавычки, как в
cat <<'EOF', и оболочка выведет всё ровно так, как написано. - Файл: сохраните результат кнопкой TXT и выводите его через
cat. Тогда ничего не нужно экранировать.
Выводите только в интерактивных оболочках
scp, rsync и sftp запускают оболочку на удалённой машине, и она может прочитать ваши файлы запуска. Если в этот момент выводится баннер, передача файлов может сорваться. Выводите баннер только в интерактивных оболочках, то есть открытых человеком.
bash: ~/.bashrc
Добавьте в конец ~/.bashrc:
if [[ $- == *i* ]]; then
cat <<'EOF'
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
fi
- Если
$-содержитi, оболочка интерактивная. - Закрывающий
EOFдолжен стоять в начале строки. С пробелами перед ним bash его не распознает.
Если вы сохранили TXT-файл как ~/.banner.txt, хватит одной строки:
[[ $- == *i* && -r ~/.banner.txt ]] && cat ~/.banner.txt
Оболочка по умолчанию в macOS — zsh, поэтому на Mac смотрите раздел про zsh ниже.
zsh: ~/.zshrc
zsh читает ~/.zshrc только в интерактивных оболочках, так что дополнительная проверка не нужна. Тот же heredoc работает:
cat <<'EOF'
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
Если вы используете Powerlevel10k с instant prompt, при запуске может появиться предупреждение о выводе в консоль. Перенесите код баннера выше блока instant prompt в начале ~/.zshrc.
fish: fish_greeting
При запуске fish вызывает функцию fish_greeting, чтобы показать приветствие. Определите свою — и баннер заменит стандартное сообщение. Добавьте в ~/.config/fish/config.fish:
function fish_greeting
cat ~/.banner.txt
end
В fish строки в одинарных кавычках превращают \\ в один \, поэтому выводить файл надёжнее, чем вставлять баннер в строку.
Добавляем цвет
Выведите ANSI-код цвета перед баннером и код сброса после. В bash или zsh:
printf '\033[36m' # cyan
cat ~/.banner.txt
printf '\033[0m' # back to normal
| Код | Цвет |
|---|---|
\033[31m |
Красный |
\033[32m |
Зелёный |
\033[33m |
Жёлтый |
\033[35m |
Пурпурный |
\033[36m |
Голубой |
\033[1m |
Жирный |
Если забыть финальный \033[0m, всё, что вы введёте дальше, останется цветным.
PowerShell: $PROFILE
При запуске PowerShell выполняет файл $PROFILE. Если его ещё нет, создайте и откройте в Блокноте:
if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
notepad $PROFILE
Добавьте это и сохраните:
$banner = @'
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
'@
Write-Host $banner -ForegroundColor Cyan
- Между
@'и'@ничего не меняется. Закрывающий'@должен стоять в начале строки. - Если новое окно сообщает, что «выполнение сценариев отключено в этой системе», измените политику выполнения для своего пользователя:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned. - Баннеры с блочными символами вроде
█ ═или нелатинским текстом (в том числе кириллицей) могут ломаться в Windows PowerShell 5.1. Сохраните профиль в Блокноте как UTF-8 с BOM или используйте PowerShell 7.
Экран входа по SSH: /etc/motd
На Linux-сервере текст из /etc/motd показывается при каждом входе по SSH всем, кто подключается.
sudo nano /etc/motd
Вставьте баннер, сохраните — и он появится со следующего входа. Имя сервера в баннере помогает не перепутать продакшен и стейджинг. Вы не знаете, каким терминалом пользуется каждый, поэтому выбирайте ASCII-шрифт вроде Standard, Slant или Small, а не блочные символы. Ubuntu также показывает сообщения, которые генерируют скрипты в /etc/update-motd.d/.
В вашей собственной CLI-утилите
То же правило действует для утилиты на Python или Node.js: не выводите баннер, когда вывод идёт в файл или другую программу.
import sys
BANNER = r"""
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
"""
if sys.stdout.isatty():
print(BANNER)
const banner = String.raw`
___ _____ __
| \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
`;
if (process.stdout.isTTY) console.log(banner);
Подробнее об экранировании строк — в руководстве по баннеру для README.
Какой шрифт лучше?
Терминалы обычно шириной 80 столбцов, а многие делят окно пополам, так что баннер не шире 60 столбцов помещается почти везде. Для длинных имён выберите узкий шрифт, например Small или Small Slant. Сравнить ширину можно в статье Как выбрать шрифт FIGlet.
Если установить программу
figlet, баннер можно рисовать при запуске командой вродеfiglet -f slant "$(hostname)". Но её нужно ставить на каждую машину, а шрифты, не входящие в комплект, — скачивать отдельно. Вставка готового баннера не требует никакой установки.