自定義ZSH啟動(dòng)信息(ASCII Art Archive )

在翻看Monica Powell的博客中發(fā)現(xiàn)了了比較有意思的東西。決定在我的iterm2也加上它。

確保 oh-my-zsh 已經(jīng)安裝在你的系統(tǒng)上。如果你還沒(méi)有安裝 oh-my-zsh,你可以通過(guò)以下命令安裝:

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)"

如果你已經(jīng)安裝,你可以切換 oh-my-zsh (omz) 和 Bash

從 oh-my-zsh 切換到 Bash

chsh -s /bin/bash

這將修改默認(rèn)shellbash。
或者運(yùn)行以下命令來(lái)立即切換到 bash

bash

從 Bash 切換到 oh-my-zsh

chsh -s /bin/zsh

請(qǐng)注意,/bin/zsh 可能根據(jù)你的系統(tǒng)安裝位置有所不同。
或者運(yùn)行以下命令來(lái)立即切換到 zsh

zsh

在切換 shell 之前,請(qǐng)確保你了解這些操作,因?yàn)樗鼈儠?huì)改變你的終端行為和配置。每次切換后,你可能需要重新配置環(huán)境變量或別名,因?yàn)樗鼈兺ǔT?.bashrc.zshrc 文件中設(shè)置。

設(shè)置靜態(tài) ASCII 字符圖案

讓我們的iterm2終端 每次啟動(dòng)或者新開一個(gè)窗口,它就會(huì)輸出下面的字符圖案;
它是這樣的

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

或是這樣的

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

通過(guò)瀏覽ASCII Art ArchiveText to ASCII Art Generator (TAAG)尋找你喜歡的字符圖案,也可以自己自定義個(gè)性的字符圖案。

[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

程序員就喜歡在控制臺(tái)或終端里加些有趣的東西,這應(yīng)該算是計(jì)算機(jī)抽象藝術(shù)吧。

在你的~/.zshrc文件或ZSH 主題文件中打開,將每一行單獨(dú)復(fù)制,并加上echo 命令。

如果你已經(jīng)安裝了oh-my-zsh (omz)環(huán)境,以下是主題文件可能所在的路徑:

~/.oh-my-zsh/themes/

如果你已經(jīng)使用了zsh,你可以在~/.zshrc文件中看到類似以下內(nèi)容:

ZSH_THEME="robbyrussell"

這里的"robbyrussell"是默認(rèn)主題的名稱。這個(gè)名稱對(duì)應(yīng)于~/.oh-my-zsh/themes/robbyrussell.zsh-theme 文件。

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

[!TIP]
需要對(duì)無(wú)法打印的字符使用反斜杠\進(jìn)行轉(zhuǎn)義,否則無(wú)法在iterm2上正確打印。

如果你想創(chuàng)建自己的主題,你可以創(chuàng)建一個(gè)新的.zsh-theme文件在~/.oh-my-zsh/themes/目錄下,然后修改.zshrc文件中的ZSH_THEME變量來(lái)使用你的新主題。
確保在修改配置文件后,運(yùn)行以下命令來(lái)使更改生效:

source ~/.zshrc

[站外圖片上傳中...(image-f19b0d-1731902012902)]

復(fù)制的內(nèi)容太多怎么辦?
不知道哪些字符需要轉(zhuǎn)義怎么辦?
那么,
可以使用 在線 JSON 校驗(yàn)格式化工具,里面有轉(zhuǎn)義選項(xiàng),可以一鍵轉(zhuǎn)義,要一行行的復(fù)制轉(zhuǎn)義,記得符合JSON格式哦。

結(jié)合變量使用

除了打印靜態(tài)信息外,還可以根據(jù)變量(例如時(shí)間)的值顯示不同的信息。要確定當(dāng)前小時(shí),可以使用以下命令:

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

根據(jù)當(dāng)前小時(shí)返回不同的greeting值,通過(guò)檢查當(dāng)前小時(shí)是否-ge(大于或等于)或-le(小于或等于)定義的特定時(shí)間范圍。

# 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 一個(gè)歡迎提示,如下圖所示:
[站外圖片上傳中...(image-9b7514-1731902012902)]

根據(jù)一天中的時(shí)間,顯示的輸出是下列消息之一:

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

可以在 GitHub 上的點(diǎn)文件中查看Monica的源碼。

設(shè)置為電腦名稱

只顯示靜態(tài)的名字就很普通,下面我們通過(guò)變量來(lái)獲取當(dāng)前電腦的賬戶名稱

# 使用 scutil 命令獲取電腦名稱
# COMPUTER_NAME=$(scutil --get ComputerName)

# 使用 hostname 命令獲取主機(jī)名
# COMPUTER_NAME=$(hostname)

# 使用 $USER 環(huán)境變量:
username="$USER"

設(shè)置 ASCII 字符顏色

設(shè)置 ANSI 顏色

那么zsh環(huán)境下的iterm2可以打印有顏色的文字

omz更新圖

那么我們自己的打印,可以讓打印更好看一點(diǎn),可以使用 ANSI 轉(zhuǎn)義序列來(lái)為控制臺(tái)輸出添加顏色。

ANSI 轉(zhuǎn)義序列中,顏色類型通常指的是文本顏色、背景顏色、亮度(例如粗體或非粗體)等。我之前提供的顏色代碼是基于文本顏色和背景顏色的 ANSI 轉(zhuǎn)義序列。下面是詳細(xì)的顏色類型:

  1. 文本顏色(Foreground colors):
    • 30-37: 標(biāo)準(zhǔn) ANSI 文本顏色(例如,30 是黑色,31 是紅色,32 是綠色,依此類推到 37 是白色)
    • 90-97: 高亮文本顏色(例如,90 是亮黑色,91 是亮紅色,92 是亮綠色,依此類推到 97 是亮白色)
  2. 背景顏色(Background colors):
    • 40-47: 標(biāo)準(zhǔn) ANSI 背景顏色(例如,40 是黑色背景,41 是紅色背景,42 是綠色背景,依此類推到 47 是白色背景)
    • 100-107: 高亮背景顏色(例如,100 是亮黑色背景,101 是亮紅色背景,102 是亮綠色背景,依此類推到 107 是亮白色背景)
  3. 亮度(Brightness):
    • 0: 重置所有屬性(包括顏色)
    • 1: 設(shè)置粗體
    • 2: 設(shè)置低亮度(不是所有終端都支持)
    • 22: 取消粗體(設(shè)置正常亮度)
      例如,\033[31m 表示紅色文本,\033[32m 表示綠色文本,而 \033[41m 表示紅色背景。
      如果你想要了解具體的顏色代碼代表什么顏色,你可以根據(jù)上述列表來(lái)判斷。例如,如果你看到 \033[33m,那么這是一個(gè)標(biāo)準(zhǔn)的 ANSI 文本顏色代碼,表示黃色文本。如果你看到 \033[43m,那么這是一個(gè)標(biāo)準(zhǔn)的 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}"

請(qǐng)確保在 echo 命令中使用 -e 選項(xiàng),以啟用對(duì)轉(zhuǎn)義序列的解釋。
這些代碼可以在你的 Zsh 腳本或直接在終端中使用。當(dāng)你完成彩色文本的輸出后,使用 reset 變量來(lái)重置顏色,以確保后續(xù)的輸出不會(huì)受到影響。
注意,并非所有的終端都支持所有的顏色代碼,但這些基本的顏色在大多數(shù)現(xiàn)代終端中都是可用的。

更改我們的內(nèi)容:

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

設(shè)置 24bit 真彩色

但是感覺(jué)還是差點(diǎn)意思,怎么才能像omz更新那樣呢?
于是,我們翻看了omz在我們本地~/.oh-my-zsh/tools/路徑下的upgrade.shupgrade.sh文件。

我們找到了定義有關(guān)顏色的源碼:

# 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
}

下面是用于檢查當(dāng)前環(huán)境是否支持真彩色(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

當(dāng)調(diào)用supports_truecolor函數(shù)時(shí),它會(huì)檢查當(dāng)前終端是否支持真彩色。如果支持,函數(shù)返回 0;
如果不支持,函數(shù)返回1(在Shell腳本中,返回1通常表示失敗或假)。

下面是我結(jié)合omz源碼,設(shè)置的自定義的ASCII字符圖案:

# 自定義靜態(tài)字符圖案
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

彩虹色打印輸出

制表符

如果你需要再字符圖案周邊加上邊框,你可以使用搜狗輸入法-符號(hào)表情-制表符找到你想要的表格符號(hào)。

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

參考資料

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容