自定义ZSH启动信息(ASCII Art Archive )

在翻看Monica Powell的博客中发现了了比较有意思的东西。决定在我的iterm2也加上它。

确保 oh-my-zsh 已经安装在你的系统上。如果你还没有安装 oh-my-zsh,你可以通过以下命令安装:

sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

或者使用 wget

sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

如果你已经安装,你可以切换 oh-my-zsh (omz) 和 Bash

从 oh-my-zsh 切换到 Bash

chsh -s /bin/bash

这将修改默认shellbash
或者运行以下命令来立即切换到 bash

bash

从 Bash 切换到 oh-my-zsh

chsh -s /bin/zsh

请注意,/bin/zsh 可能根据你的系统安装位置有所不同。
或者运行以下命令来立即切换到 zsh

zsh

在切换 shell 之前,请确保你了解这些操作,因为它们会改变你的终端行为和配置。每次切换后,你可能需要重新配置环境变量或别名,因为它们通常在 .bashrc.zshrc 文件中设置。

设置静态 ASCII 字符图案

让我们的iterm2终端 每次启动或者新开一个窗口,它就会输出下面的字符图案;
它是这样的

 _   _      _ _        __        __         _     _ _
| | | | ___| | | ___   \ \      / /__  _ __| | __| | |
| |_| |/ _ \ | |/ _ \   \ \ /\ / / _ \| '__| |/ _` | |
|  _  |  __/ | | (_) |   \ V  V / (_) | |  | | (_| |_|
|_| |_|\___|_|_|\___/     \_/\_/ \___/|_|  |_|\__,_(_)

或是这样的

                      /^--^\     /^--^\     /^--^\
                      \____/     \____/     \____/
                     /      \   /      \   /      \
KAT                 |        | |        | |        |
                     \__  __/   \__  __/   \__  __/
|^|^|^|^|^|^|^|^|^|^|^|^\ \^|^|^|^/ /^|^|^|^|^\ \^|^|^|^|^|^|^|^|^|^|^|^|
| | | | | | | | | | | | |\ \| | |/ /| | | | | | \ \ | | | | | | | | | | |
########################/ /######\ \###########/ /#######################
| | | | | | | | | | | | \/| | | | \/| | | | | |\/ | | | | | | | | | | | |
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|

通过浏览ASCII Art ArchiveText to ASCII Art Generator (TAAG)寻找你喜欢的字符图案,也可以自己自定义个性的字符图案。

[ASCII art] is the most universal computer art form in the world — every computer system capable of displaying multi-line text can display ASCII art, without needing to have a graphics mode or support a particular graphics file format. — ASCII Art Archive

程序员就喜欢在控制台或终端里加些有趣的东西,这应该算是计算机抽象艺术吧。

在你的~/.zshrc文件或ZSH 主题文件中打开,将每一行单独复制,并加上echo 命令。

如果你已经安装了oh-my-zsh (omz)环境,以下是主题文件可能所在的路径:

~/.oh-my-zsh/themes/

如果你已经使用了zsh,你可以在~/.zshrc文件中看到类似以下内容:

ZSH_THEME="robbyrussell"

这里的"robbyrussell"是默认主题的名称。这个名称对应于~/.oh-my-zsh/themes/robbyrussell.zsh-theme 文件。

 # ~/.zshrc OR your zsh theme file
 echo " ___"
 echo "|[_]|"
 echo "|+ ;| "
 echo "\`---'"

[!TIP]
需要对无法打印的字符使用反斜杠\进行转义,否则无法在iterm2上正确打印。

如果你想创建自己的主题,你可以创建一个新的.zsh-theme文件在~/.oh-my-zsh/themes/目录下,然后修改.zshrc文件中的ZSH_THEME变量来使用你的新主题。
确保在修改配置文件后,运行以下命令来使更改生效:

source ~/.zshrc

[站外图片上传中...(image-f19b0d-1731902012902)]

复制的内容太多怎么办?
不知道哪些字符需要转义怎么办?
那么,
可以使用 在线 JSON 校验格式化工具,里面有转义选项,可以一键转义,要一行行的复制转义,记得符合JSON格式哦。

结合变量使用

除了打印静态信息外,还可以根据变量(例如时间)的值显示不同的信息。要确定当前小时,可以使用以下命令:

date +"%H"
18 # output at 6PM

根据当前小时返回不同的greeting值,通过检查当前小时是否-ge(大于或等于)或-le(小于或等于)定义的特定时间范围。

# Get the current hour in 24-hour format
hour=$(date +"%H")

# Define time ranges
morning_start=5    # 5 AM
morning_end=11     # 11 AM
afternoon_start=12 # 12 PM
afternoon_end=17   # 5 PM


# Check the time of day and print a message
if [ "$hour" -ge "$morning_start" ] && [ "$hour" -le "$morning_end" ]; then
    greeting="Good morning"
elif [ "$hour" -ge "$afternoon_start" ] && [ "$hour" -le "$afternoon_end" ]; then
    greeting="Good afternoon"
else
    greeting="Good evening"
fi

 echo " ___"
 echo "|[_]|"
 echo "|+ ;|  ✦ $greeting, Monica! ✦" # string interpolation
 echo "\`---'"

上述脚本输出了~/.zshrc 一个欢迎提示,如下图所示:
[站外图片上传中...(image-9b7514-1731902012902)]

根据一天中的时间,显示的输出是下列消息之一:

  • ✦ Good morning, Monica! ✦
  • ✦ Good afternoon, Monica! ✦
  • ✦ Good evening, Monica! ✦

可以在 GitHub 上的点文件中查看Monica的源码。

设置为电脑名称

只显示静态的名字就很普通,下面我们通过变量来获取当前电脑的账户名称

# 使用 scutil 命令获取电脑名称
# COMPUTER_NAME=$(scutil --get ComputerName)

# 使用 hostname 命令获取主机名
# COMPUTER_NAME=$(hostname)

# 使用 $USER 环境变量:
username="$USER"

设置 ASCII 字符颜色

设置 ANSI 颜色

那么zsh环境下的iterm2可以打印有颜色的文字

omz更新图

那么我们自己的打印,可以让打印更好看一点,可以使用 ANSI 转义序列来为控制台输出添加颜色。

ANSI 转义序列中,颜色类型通常指的是文本颜色、背景颜色、亮度(例如粗体或非粗体)等。我之前提供的颜色代码是基于文本颜色和背景颜色的 ANSI 转义序列。下面是详细的颜色类型:

  1. 文本颜色(Foreground colors):
    • 30-37: 标准 ANSI 文本颜色(例如,30 是黑色,31 是红色,32 是绿色,依此类推到 37 是白色)
    • 90-97: 高亮文本颜色(例如,90 是亮黑色,91 是亮红色,92 是亮绿色,依此类推到 97 是亮白色)
  2. 背景颜色(Background colors):
    • 40-47: 标准 ANSI 背景颜色(例如,40 是黑色背景,41 是红色背景,42 是绿色背景,依此类推到 47 是白色背景)
    • 100-107: 高亮背景颜色(例如,100 是亮黑色背景,101 是亮红色背景,102 是亮绿色背景,依此类推到 107 是亮白色背景)
  3. 亮度(Brightness):
    • 0: 重置所有属性(包括颜色)
    • 1: 设置粗体
    • 2: 设置低亮度(不是所有终端都支持)
    • 22: 取消粗体(设置正常亮度)
      例如,\033[31m 表示红色文本,\033[32m 表示绿色文本,而 \033[41m 表示红色背景。
      如果你想要了解具体的颜色代码代表什么颜色,你可以根据上述列表来判断。例如,如果你看到 \033[33m,那么这是一个标准的 ANSI 文本颜色代码,表示黄色文本。如果你看到 \033[43m,那么这是一个标准的 ANSI 背景颜色代码,表示黄色背景。

以下是一些基本的颜色代码示例:

# 重置颜色
reset="\033[0m"
# 文字颜色
red="\033[31m"
green="\033[32m"
yellow="\033[33m"
blue="\033[34m"
magenta="\033[35m"
cyan="\033[36m"
white="\033[37m"
# 背景颜色
bg_red="\033[41m"
bg_green="\033[42m"
bg_yellow="\033[43m"
bg_blue="\033[44m"
bg_magenta="\033[45m"
bg_cyan="\033[46m"
bg_white="\033[47m"
# 打印示例
echo -e "${red}This is red text${reset}"
echo -e "${green}This is green text${reset}"
echo -e "${yellow}This is yellow text${reset}"
echo -e "${blue}This is blue text${reset}"
echo -e "${magenta}This is magenta text${reset}"
echo -e "${cyan}This is cyan text${reset}"
echo -e "${white}This is white text${reset}"
# 带背景颜色
echo -e "${bg_red}${white}This is white text on a red background${reset}"

请确保在 echo 命令中使用 -e 选项,以启用对转义序列的解释。
这些代码可以在你的 Zsh 脚本或直接在终端中使用。当你完成彩色文本的输出后,使用 reset 变量来重置颜色,以确保后续的输出不会受到影响。
注意,并非所有的终端都支持所有的颜色代码,但这些基本的颜色在大多数现代终端中都是可用的。

更改我们的内容:

echo " ___"
echo "|[_]|"
echo -e "|+ ;|  ${magenta}✦ $greeting,$username! ✦${reset}"
echo "\`---'"
更改文字颜色后的效果

设置 24bit 真彩色

但是感觉还是差点意思,怎么才能像omz更新那样呢?
于是,我们翻看了omz在我们本地~/.oh-my-zsh/tools/路径下的upgrade.shupgrade.sh文件。

我们找到了定义有关颜色的源码:

# Adapted from code and information by Anton Kochkov (@XVilka)
# Source: https://gist.github.com/XVilka/8346728
supports_truecolor() {
  case "$COLORTERM" in
  truecolor|24bit) return 0 ;;
  esac

  case "$TERM" in
  iterm           |\
  tmux-truecolor  |\
  linux-truecolor |\
  xterm-truecolor |\
  screen-truecolor) return 0 ;;
  esac

  return 1
}

下面是用于检查当前环境是否支持真彩色(truecolor)输出。真彩色指的是能够输出 24 位颜色,即能够显示 16,777,216 种不同的颜色。

if supports_truecolor; then
  FMT_RAINBOW="
    $(printf '\033[38;2;255;0;0m')
    $(printf '\033[38;2;255;97;0m')
    $(printf '\033[38;2;247;255;0m')
    $(printf '\033[38;2;0;255;30m')
    $(printf '\033[38;2;77;0;255m')
    $(printf '\033[38;2;168;0;255m')
    $(printf '\033[38;2;245;0;172m')
  "
else
  FMT_RAINBOW="
    $(printf '\033[38;5;196m')
    $(printf '\033[38;5;202m')
    $(printf '\033[38;5;226m')
    $(printf '\033[38;5;082m')
    $(printf '\033[38;5;021m')
    $(printf '\033[38;5;093m')
    $(printf '\033[38;5;163m')
  "
fi

当调用supports_truecolor函数时,它会检查当前终端是否支持真彩色。如果支持,函数返回 0
如果不支持,函数返回1(在Shell脚本中,返回1通常表示失败或假)。

下面是我结合omz源码,设置的自定义的ASCII字符图案:

# 自定义静态字符图案
echo "                                                                                                "
echo "╔══════════════════════════════════════════════════════════════════════════════════════════════╗"
echo "║                                                                                              ║"
echo "║     dMP dMP dMMMMMP dMP     dMP    .aMMMb        dMP dMP dMP .aMMMb  dMMMMb  dMP     dMMMMb  ║"
echo "║    dMP dMP dMP     dMP     dMP    dMP\"dMP       dMP dMP dMP dMP\"dMP dMP.dMP dMP     dMP VMP  ║"
echo "║   dMMMMMP dMMMP   dMP     dMP    dMP dMP       dMP dMP dMP dMP dMP dMMMMK\" dMP     dMP dMP   ║"
echo "║  dMP dMP dMP     dMP     dMP    dMP.aMP       dMP.dMP.dMP dMP.aMP dMP\"AMF dMP     dMP.aMP    ║"
echo "║ dMP dMP dMMMMMP dMMMMMP dMMMMMP VMMMP\"        VMMMPVMMP\"  VMMMP\" dMP dMP dMMMMMP dMMMMP\"     ║"
echo "║                                                                                              ║"
echo "╚══════════════════════════════════════════════════════════════════════════════════════════════╝"
echo "                                                                                                "

更改彩虹色的ASCII字符图案:

# Adapted from code and information by Anton Kochkov (@XVilka)
# Source: https://gist.github.com/XVilka/8346728
supports_truecolor() {
  case "$COLORTERM" in
  truecolor|24bit) return 0 ;;
  esac

  case "$TERM" in
  iterm           |\
  tmux-truecolor  |\
  linux-truecolor |\
  xterm-truecolor |\
  screen-truecolor) return 0 ;;
  esac

  return 1
}

setup_color() {
  # Only use colors if connected to a terminal
  if ! is_tty; then
    CUSTOM_COLOR_COLORRAINBOW=""
    CUSTOM_COLOR_RED=""
    CUSTOM_COLOR_GREEN=""
    CUSTOM_COLOR_YELLOW=""
    CUSTOM_COLOR_BLUE=""
    CUSTOM_COLOR_BOLD=""
    CUSTOM_COLOR_RESET=""
    return
  fi

  if supports_truecolor; then
    CUSTOM_COLOR_RAINBOW=(
      "$(printf '\033[38;2;255;0;0m')"
      "$(printf '\033[38;2;255;97;0m')"
      "$(printf '\033[38;2;247;255;0m')"
      "$(printf '\033[38;2;0;255;30m')"
      "$(printf '\033[38;2;77;0;255m')"
      "$(printf '\033[38;2;168;0;255m')"
      "$(printf '\033[38;2;245;0;172m')"
      "$(printf '\033[38;2;133;177;255m')"
      "$(printf '\033[38;2;225;97;220m')"
      "$(printf '\033[38;2;230;230;250m')"
    )
  else
    CUSTOM_COLOR_RAINBOW=(
      "$(printf '\033[38;5;196m')"
      "$(printf '\033[38;5;202m')"
      "$(printf '\033[38;5;226m')"
      "$(printf '\033[38;5;082m')"
      "$(printf '\033[38;5;021m')"
      "$(printf '\033[38;5;093m')"
      "$(printf '\033[38;5;163m')"
      "$(printf '\033[38;5;196m')"
      "$(printf '\033[38;5;213m')"
      "$(printf '\033[38;5;255m')"
    )
  fi

  CUSTOM_COLOR_RED=$(printf '\033[31m')
  CUSTOM_COLOR_GREEN=$(printf '\033[32m')
  CUSTOM_COLOR_YELLOW=$(printf '\033[33m')
  CUSTOM_COLOR_BLUE=$(printf '\033[34m')
  CUSTOM_COLOR_BOLD=$(printf '\033[1m')
  CUSTOM_COLOR_RESET=$(printf '\033[0m')
}

# Use colors, but only if connected to a terminal
# and that terminal supports them.

# The [ -t 1 ] check only works when the function is not called from
# a subshell (like in `$(...)` or `(...)`, so this hack redefines the
# function at the top level to always return false when stdout is not
# a tty.
if [ -t 1 ]; then
  is_tty() {
    true
  }
else
  is_tty() {
    false
  }
fi


print_custom_welcome_log() {
  printf "\n"
  printf '\n'
  printf '╔══════════════════════════════════════════════════════════════════════════════════════════════╗\n'
  printf '║                                                                                              ║\n'
  printf '║%s     dMP dMP %sdMMMMMP %sdMP     %sdMP    %s.aMMMb        %sdMP dMP dMP %s.aMMMb  %sdMMMMb  %sdMP     %sdMMMMb  %s║\n' $CUSTOM_COLOR_RAINBOW $CUSTOM_COLOR_RESET
  printf '║%s    dMP dMP %sdMP     %sdMP     %sdMP    %sdMP"dMP       %sdMP dMP dMP %sdMP"dMP %sdMP.dMP %sdMP     %sdMP VMP  %s║\n' $CUSTOM_COLOR_RAINBOW $CUSTOM_COLOR_RESET
  printf '║%s   dMMMMMP %sdMMMP   %sdMP     %sdMP    %sdMP dMP       %sdMP dMP dMP %sdMP dMP %sdMMMMK" %sdMP     %sdMP dMP   %s║\n' $CUSTOM_COLOR_RAINBOW $CUSTOM_COLOR_RESET
  printf '║%s  dMP dMP %sdMP     %sdMP     %sdMP    %sdMP.aMP       %sdMP.dMP.dMP %sdMP.aMP %sdMP"AMF %sdMP     %sdMP.aMP    %s║\n' $CUSTOM_COLOR_RAINBOW $CUSTOM_COLOR_RESET
  printf '║%s dMP dMP %sdMMMMMP %sdMMMMMP %sdMMMMMP %sVMMMP"        %sVMMMPVMMP"  %sVMMMP" %sdMP dMP %sdMMMMMP %sdMMMMP"     %s║\n' $CUSTOM_COLOR_RAINBOW $CUSTOM_COLOR_RESET
  printf '║                                                                                              ║\n'
  printf '╚══════════════════════════════════════════════════════════════════════════════════════════════╝\n'
  printf '\n'
  printf '\n'


  echo " ___"
  echo "|[_]|"
  echo -e "|+ ;|  ${CUSTOM_COLOR_YELLOW}✦ $greeting,$username! ✦${CUSTOM_COLOR_RESET}"
  echo "\`---'"
}

setup_color

print_custom_welcome_log

彩虹色打印输出

制表符

如果你需要再字符图案周边加上边框,你可以使用搜狗输入法-符号表情-制表符找到你想要的表格符号。

┏┳┓╔╦╗╓╥╖
┣╋┫╠╬╣╟╫╢
┗┻┛╚╩╝╙╨╜
┌┬┐╭╮╱╲┃║
├┼┤╰╯╲╱┆┇
└┴┘━═┅┈╳
搜狗输入法-符号表情-制表符

参考资料

Monica's Digital Playground
Custom ZSH Startup Message
ASCII Art Archive
ASCII Art Game consoles - asciiart.eu
Text to ASCII Art Generator (TAAG)
在线 JSON 校验格式化工具

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容