首页 > 解决方案 > 终端的条件 ZSH_THEME

问题描述

我试图在调用 .zshrc 时根据我正在运行的终端模拟器选择特定主题时做到这一点。为此,我想出了:

current_terminal="$(ps -p$PPID -o cmd=)"

function choose_theme {
        if [ $current_terminal=~'tilix' ];
        then echo 'powerlevel9k/powerlevel9k';
        else echo 'robbyrussell';
        fi
}

ZSH_THEME="$(choose_theme)"

运行时我没有收到任何错误消息,当我在 tilix 上打开它时,它与 powerlevel9k 主题配合得很好,但就是这样,它似乎不尊重条件,我不知道我的错误可能在哪里= /

我正在使用的每个终端仿真器中变量 current_terminal 的输出是:

蒂利克斯:

/usr/bin/tilix --gapplication-service

默认终端:

/usr/lib/gnome-terminal/gnome-terminal-server

所以它让事情变得正确,但出于某种原因总是设置第一个选项

标签: terminalzshoh-my-zshzshrcterminal-emulator

解决方案


由于两个原因,这不起作用:

  1. 您正在使用[ ... ]而不是[[ ... ]]检查。不同之处在于它[[ ... ]]是 ZSH 语法的一部分,而[(aka ) 是一个尝试模拟外部程序test的内置命令。test这很重要,因为[不支持=~运算符,它仅在内部可用[[ ... ]]

  2. =~与任何其他运算符一样)需要被空格包围。作为 Unix shell,ZSH 在空格上标记命令。在这种情况下 ZSH 我猜想 ZSH 只检查是否$current_terminal=~'tilix'评估为非空字符串而不是$current_terminal比较'tilix'. 情况总是如此,因此您总是获得 powerlevel9k 主题。

所以条件应该是这样的:

current_terminal="$(ps -p$PPID -o cmd=)"

function choose_theme {
    if [[ $current_terminal =~ 'tilix' ]];
    then echo 'powerlevel9k/powerlevel9k';
    else echo 'robbyrussell';
    fi
}

ZSH_THEME="$(choose_theme)"

推荐阅读