Linux 使用从pwd派生的动态文本编辑终端promt 短版

Linux 使用从pwd派生的动态文本编辑终端promt 短版,linux,bash,terminal,command-prompt,Linux,Bash,Terminal,Command Prompt,使用此提示获取此绿色: 这一行: export PS1=“\w:\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]\$” 但是在一个函数中工作,所以 my_函数(){ echo-e“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]” #回显“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]” } export PS1=“\w:\$(my\u函数)\$” 不幸的是,我得到这个提示:~/Work/te

使用此提示获取此绿色:

这一行:

export PS1=“\w:\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]\$”
但是在一个函数中工作,所以

my_函数(){
echo-e“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]”
#回显“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]”
}
export PS1=“\w:\$(my\u函数)\$”
不幸的是,我得到这个提示:
~/Work/temp/prompt\u test:\[\][绿色]\[\]$

*你不能用
$(我的功能)
代替
\$(我的功能)
-为什么?详细解释如下

详细解释 我试图满足两个条件:

条件1 我可以使用以下代码为提示添加颜色:

export PS1=“\w:$(tput setaf 2)绿色$(tput sgr 0)\$”

但是,如果我输入一个长命令,然后单击
home
+
end
-某个东西变得一团糟-以复制行为:

  • export PS1=“\w:$(tput setaf 2)绿色$(tput sgr 0)\$”
  • 键入一个长命令(不输入):
    long命令,包含多个charterssssss
  • 单击主页
  • 单击
    end
  • 尝试使用
    退格删除所有字符
  • 我可以修复在
    颜色命令之前和之后添加
    \[
    \]
    的问题:

    export PS1=“\w:\[$(tput setaf 2)\]绿色\[$(tput sgr 0)\]\$”
    
    这就解决了问题。 让我们调用“预防该问题”条件1

    条件2 要让PS1行在每次目录更改时动态计算。 因此,给定以下结构(基本上是两个文件夹:
    mkdir蓝红色
    ) 两个文件夹:
    +--红色
    +--蓝色

    然后使用一个简单的bash函数来检查
    pwd
    是否包含
    blue
    red
    ,然后在提示符中添加颜色,这样每当我切换到带有
    blue
    路径的文件夹时,我就会得到
    blue
    ,与
    red
    相同

    change_color2(){
    本地my_pwd=$(pwd)
    如果[$my_pwd=*“blue”*];则#包含“blue”的路径
    回显“$(tput setaf 4)$(tput sgr 0)”
    elif[$my_pwd=*“red”*];然后#包含“red”的路径
    回显“$(tput setaf 1)$(tput sgr 0)”
    fi
    }
    export PS1=“\w:\$(更改颜色2)\$”
    cd红
    镉蓝
    

    请注意,如果我使用
    $(更改颜色2)
    而不是
    \$(更改颜色2)

    我试图同时满足这两个条件,但我不能-你能帮我吗? 多谢各位

    Ubuntu 20.04

    /bin/bash

    正如pynexj在他的回答中提到的,解决方案是使用
    提示符命令
    ,这是在PS1之前评估的函数

    所以我能做到

    my_函数(){
    echo-e“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]”
    #回显“\[$(tput setaf 2)\][绿色]\[$(tput sgr 0)\]”
    }
    更新_PS1(){
    PS1=“\w:$(my\u函数)\$”
    }
    PROMPT\u命令=更新\u PS1
    #export PS1=“\w:\$(my\u函数)\$”
    

    这次在
    update\u PS1
    中,我使用的是
    $(我的函数)
    ,而不是
    \$(我的函数)
    ,但这没关系-它仍然适用于条件2,因为使用
    PROMPT\u命令
    每次我更改新文件夹时都会对
    PS
    变量求值。

    你的问题只与准编程有关,更重要“如何使用
    tput
    ?”和“如何修改Linux提示符?”也就是说,当在提示符中包含控制字符时,转义字符无法准确计数,这会导致错误的内部提示符长度,这解释了[Home]和[End]以及[Backspace]的原因未能正确清除该命令。您可能会在或..@DavidC.Rankin上得到更多的响应-我将在那里尝试,谢谢。这也是一个很好的例子,说明了为什么如果您使用
    printf
    进行输出,您不必担心处理控制代码的选项
    :)
    @DavidC.Rankin我不明白-如何使用de>printf
    在给出的示例中,使用
    echo
    必须告诉它使用
    echo-e
    处理转义,默认情况下,
    printf
    以其格式字符串处理转义。