首页 > 解决方案 > 使用 catimg 并排显示两件事(如在 neofetch 中)

问题描述

我正在尝试使用 bash 创建类似 neofetch 的东西。

我想在右侧显示一个图像和一个 ascii 艺术(使用 cat << EOF myascii EOF 命令),以便我可以在另一侧显示徽标和文本。

当我 ssh 我的一些机器时,我想将它用作我的登录欢迎屏幕。

因此,我能够通过以下方式展示 ascii 艺术:

cat << EOF

 _____         _   
|_   _|       | |  
  | | ___  ___| |_ 
  | |/ _ \/ __| __|
  | |  __/\__ \ |_ 
  \_/\___||___/\__|
                   
                   

EOF

并使用显示我的图像catimg myimage.png

但是,我尝试并排展示它们。我尝试使用公关。 pr -m -t <(catimg) <(cat mytestfile.txt)但它不起作用,它削减了我的 ascii 艺术。

使用粘贴命令也是如此。

有没有人能做到。如果是怎么办?我的 ascii 艺术也很安静,所以如果没有它被切割它会很棒。

谢谢你的帮助。

标签: bashscriptingcat

解决方案


通过合并catimg和的输出生成txt文件figlet

我将使用ANSI 转义码简单地将两个输出放在正确的位置,而不是真正的合并

{
    mapfile aa < <(figlet -w40 $text)
    printf "%s" "${aa[@]}"
    catimg -w40 "$image" |
        sed "\$!s/^/\o33[40C/;1s/^/\o33[${#aa[@]}A/"
} >outputfile.txt

figlet-catimg

这可以写成一个函数:

mkTextImage() {
    local aa width=${COLUMNS} prcent=50 text image lwidth rwidth ffont
    while [ "${1::1}" == "-" ] ;do
        case $1 in 
            -w) shift;width=$1;shift;;
            -p) shift;prcent=$1;shift;;
            -f) shift;ffont="-f $1";shift;;
        esac
    done
    text="$1" image="$2"
    printf -v lwidth %.0f $(
         bc -l <<<"$width/100*$prcent")
    rwidth=$((width-lwidth))
    mapfile aa < <(figlet -w$lwidth $ffont $text)
    printf "%s" "${aa[@]}"
    catimg -w$rwidth "$image" |
        sed "\$!s/^/\o33[${lwidth}C/;1s/^/\o33[${#aa[@]}A/"
}

并反过来:

(注意:这项工作,而catimg长度保持大于figlet长度)

mkImageText () { 
    local aa fl width=${COLUMNS} prcent=50 text image lwidth rwidth ffont
    while [ "${1::1}" == "-" ] ;do
        case $1 in 
            -w) shift;width=$1;shift;;
            -p) shift;prcent=$1;shift;;
            -f) shift;ffont="-f $1";shift;;
        esac
    done
    image="$1" text="$2"
    printf -v lwidth %.0f $(bc -l <<<"$width/100*$prcent")
    rwidth=$((width-lwidth))
    mapfile aa < <(catimg -w$lwidth "$image")
    printf "%s" "${aa[@]}"
    printf "\e[$((${#aa[@]}-1))A"
    mapfile fl < <(figlet -w$rwidth $ffont "$text")
    printf "\e[${lwidth}C%s" "${fl[@]}"
    printf "\e[$((${#aa[@]}-${#fl[@]}-1))B"
}

catimg-figlet

从那里开始,关于您的评论:尝试使用42%80列宽度的图像:

mkImageText -f small -p 42 spongebob.png "Sponge Bob"

或者

mkTextImage -f small -p 58 "Sponge Bob" spongebob.png 

将渲染:

80x25 终端上两个命令的 Gif 动画

然后你可以尝试使用-f smblock选项,或者修改函数来使用toilet而不是figlet......


推荐阅读