将一个字符串加下划线直到该行的结尾

时间:2014-06-24 17:06:13

标签: bash

我有以下代码,它根据最后一个命令是否成功执行(显示在PS1之前)显示一条消息:

function previous_command() {
    exit_code=$?
    if [ $exit_code -eq 0 ]; then
        echo -e "\033[1;4;32mCommand successful\033[00m"
    else
        echo -e "\033[1;4;31mCommand failed with exit code $exit_code\033[00m"
    fi
}

我想要做的是将下划线一直延伸到当前终端窗口的边缘,如下所示:

Bash draw underline until the edge of the terminal window

假设退出代码长度为一个字符,我可以通过添加空格将其硬编码为80个字符,但如果我调整窗口大小或获得10或更高的退出代码,则会失败。

如何将此功能动态继续到终端窗口的边缘?

2 个答案:

答案 0 :(得分:4)

您可以将带有空格的字符串与printf "%-42s"对齐为42个字符。您可以使用$COLUMNS获取窗口宽度。把它们放在一起,我们得到:

printf "\033[1;4;31m%-${COLUMNS}s\033[00m" "Command failed with $RANDOM"

无论(这里是随机的)数字是多少位数,该行总是一直延伸到边缘。

答案 1 :(得分:1)

这可行,但可能不是最佳解决方案:

function previous_command() {
    if [ $? -eq 0 ]; then
        COLOR=2
        RESPONSE="Command successful"
    else
        COLOR=1
        RESPONSE="Command failed with exit code $?"
    fi
    COLS=`tput cols`
    LENGTH=${#RESPONSE}
    while [ $LENGTH -lt $COLS ]
    do
        RESPONSE+=" "
        LENGTH=$[$LENGTH+1]
    done
    echo -e "$(tput setaf $COLOR ; tput smul)$RESPONSE\e[00m"
}

这将强调控制台当前的宽度,但如果调整大小则不会。