如何打印当前bash提示符?

如何打印当前bash提示符?,bash,prompt,ps1,Bash,Prompt,Ps1,问题很简单。我想计算bash脚本中PS1的当前值 google上的所有资料都指向了关于如何拉皮条的教程,但我想评估一下,看看我当前的终端,或者至少是某个终端会如何呈现它 是否有任何软件/功能可以帮助我实现这一点?当然,我希望对所有转义字符进行求值,因此,echo$PS1在我的情况下没有那么有用。编辑/etc/bashrc文件 您可以将此作为示例并检查输出 # If id command returns zero, you’ve root access. if [ $(id -u) -eq

问题很简单。我想计算bash脚本中
PS1
的当前值

google上的所有资料都指向了关于如何拉皮条的教程,但我想评估一下,看看我当前的终端,或者至少是某个终端会如何呈现它


是否有任何软件/功能可以帮助我实现这一点?当然,我希望对所有转义字符进行求值,因此,
echo$PS1
在我的情况下没有那么有用。

编辑/etc/bashrc文件

您可以将此作为示例并检查输出

    # If id command returns zero, you’ve root access.
if [ $(id -u) -eq 0 ];
then # you are root, set red colour prompt
  PS1="\\[$(tput setaf 1)\\]\\u@\\h:\\w #\\[$(tput sgr0)\\]"
else # normal
  PS1="[\\u@\\h:\\w] $"
fi

还有一种可能性,使用
script
实用程序(ubuntu上
bsdutils
包的一部分):

说明:

printenv <name_of_var_to_see>
尝试在终端上手动输入这些命令。将这些命令原样复制到
herdoc
下,并用鼠标中键粘贴。脚本命令的stdout将包含非常类似的内容

e、 g.在上述情况下,脚本命令的输出给出:

PS1="\e[31;1m\u@\h:\n\e[0;1m$ \e[0m"; HISTFILE=/dev/null
alias some_random_string_here_that_is_not_part_of_PS1=true
some_random_string_here_that_is_not_part_of_PS1
some_random_string_here_that_is_not_part_of_PS1
 \e[0m"; HISTFILE=/dev/nullhsane-dev : ~/Desktop $ PS1="\e[31;1m\u@\h:\n\e[0;1m$ 
anishsane@anishsane-dev:
$ alias some_random_string_here_that_is_not_part_of_PS1=true
anishsane@anishsane-dev:
$ some_random_string_here_that_is_not_part_of_PS1
anishsane@anishsane-dev:
$ some_random_string_here_that_is_not_part_of_PS1
anishsane@anishsane-dev:
$ exit
使用“some_random_string_here_that_not_part_of_PS1”作为分隔符(awk的记录分隔符)拆分该标准输出,并打印除一条记录外的最后一条记录

EDIT2:

printenv <name_of_var_to_see>
另一种机制(使用bash源代码和gdb):

$gdb-batch-p$$-ex'调用bind_变量(“扩展的_PS1”,解码_提示_字符串(获取_字符串_值(“PS1”)),0)'
$echo“$expanded_PS1”
  • 不过这里有一个小问题。
    PS1
    中的
    \[
    \]
    字符串将分别打印为
    \1
    /
    \2
    。您可以使用
    tr-d'\1\2'删除那些,请尝试以下命令

    echo $PS1 | 
    sed -e s/'\\d'/"$(date +'%a %b %_d')"/g | 
    sed -e s/'\\t'/"$(date +'%T')"/g | 
    sed -e s/'\\@'/"$(date +'%r')"/g | 
    sed -e s/'\\T'/"$(date +'%r'| awk {'print $1'})"/g | 
    sed -e s/'\\e'//g | sed -e s/'\\h'/"$HOSTNAME"/g | 
    sed -e s/'\\h'/"$HOSTNAME"/g | 
    sed -e s/'\\H'/"$HOSTNAME"/g | 
    sed -e s/'\\u'/"$USER"/g | 
    sed -e s@'\\W'@"$(pwd)"@g | 
    sed -e s/'\\w'/"$(pwd | sed -e s@$HOME@'~'@g )"/g | 
    sed -e s/"\\\\"//g | 
    sed -e s/"\\["//g | 
    sed -e s/"\\]"/*/g | 
    cut -d'*' -f2 | 
    cut -d';' -f2 | 
    sed s/\ //g | 
    sed -e s/[a-z]$/"$([ "$USER" != "root" ] && echo \$ || echo \#)"/g
    

    另一种方法是
    eval
    回显您的提示以处理任何扩展(不确定括号为何保留)。这很可能不如@anishsane的方法健壮,但可能更快一些:

    show-prompt() {
        eval 'echo -en "'$PS1'"' | sed -e 's#\\\[##g' -e 's#\\\]##g'
    }
    # To show it in a function registered with `complete -F` on
    # a single tab, and keep the user's input:
    show-prompt
    echo -n "${COMP_WORDS[@]}"
    

    关于这一点,我已经做了修改。

    我会得到这样的结果:

    echo $PS1
    
    然后用编辑器编辑它。测试之后(在会话处于活动状态时设置):

    (\u代表用户,\h代表主机,\w代表完整路径,\w代表短路径)

    如果我喜欢,我将通过在~/.bashrc中更改PS1的值使其永久化

    附言:

    如果要查看所有全局变量,请执行以下操作:

    printenv
    
    或:

    printenv <name_of_var_to_see>
    
    printenv
    
    Bash 4.4+解决方案对提示字符串使用参数转换:
    echo”${PS1@P}“

    [adamhotep@tabasco~]$echo“提示为”${PS1@P}'"
    提示是'[adamhotep@tabasco ~]$'
    [adamhotep@tabasco~]$TEST\u STRING='\u正在\t使用\s\V进餐
    [adamhotep@tabasco~]$echo“${TEST\u STRING}”
    \u正在使用\s\V在\t用餐
    [adamhotep@tabasco~]$echo“${测试_STRING@P}"
    adamhotep使用Bash5.0.3在21:45:10用餐
    [adamhotep@tabasco ~]$ 
    
    从上的页面:

    ${parameter@operator}

    参数转换。展开是参数值或参数本身信息的转换,具体取决于运算符的值。
    每个操作员都是一个字母:

    Q扩展是一个字符串,它是在
    可重复用作输入的格式。
    扩展是一个字符串,它是带反斜杠的参数值
    转义序列与$'…'引用机制一样展开。
    P扩展是一个字符串,它是扩展
    参数,就好像它是提示字符串一样(请参见下面的提示)。
    扩展是赋值语句或
    声明命令,如果对该命令求值,将使用其
    属性和价值。
    扩展是一个字符串,由表示
    参数的属性。
    
    如果参数为
    @
    *
    ,则操作依次应用于每个位置参数,展开为结果列表。如果参数是一个数组变量,下标为
    @
    *
    ,则该操作将依次应用于数组的每个成员,展开为结果列表

    (另请参见重复问题。)

    zshell
    zsh
    )可以使用
    ${(%%)PS1}
    或其
    打印
    内置的
    -p
    标志执行此操作:

    [adamhotep@tabasco~]%echo“提示为“${(%%)PS1}”
    提示是'[adamhotep@tabasco ~]%'
    [adamhotep@tabasco~]%print-P“提示为“$PS1”
    提示是'[adamhotep@tabasco ~]%'
    [adamhotep@tabasco~]%TEST\u STRING=“%n正在使用%n$ZSH\u版本在%*用餐”
    [adamhotep@tabasco~]%echo“$TEST\u字符串”
    %n使用%n 5.7.1在%*用餐
    [adamhotep@tabasco~]%echo“${(%)测试字符串}”
    adamhotep使用zsh 5.7.1在11:49:01用餐
    [adamhotep@tabasco~]%打印-P“$TEST\u字符串”
    adamhotep使用zsh 5.7.1在11:49:07用餐
    [adamhotep@tabasco ~]% 
    
    手册告诉我们:

    。如果左大括号后面紧跟着一个左括号,则匹配的右括号之前的字符串将被视为标志列表。在重复标志有意义的情况下,重复不必是连续的;例如,
    (q%q%q)
    与可读性更高的
    (%qq)
    的含义相同。支持以下标志:

    %%
    展开所有
    %%
    以与中相同的方式在结果字中转义 提示(请参见)。如果该标志给出两次,则为full 根据结果词的不同,会对结果词进行快速扩展 设置
    PROMPT\u PERCENT
    PROMPT\u SUBST
    PROMPT\u BANG
    选项

    从以下文件中:

    -p
    执行提示扩展(请参阅)。与
    -f
    结合使用时,提示转义序列仅在插入的参数内解析,而不是在
    printenv
    
    printenv <name_of_var_to_see>