如何打印当前的bash提示符?

问题很简单。 我想在我的bash脚本中评估PS1当前值。

谷歌上的所有资料都指向了一些教程,但我想评估一下,看看它将如何呈现在我的当前终端上,或者至少由某个终端呈现。

有什么软/功能可以帮助我实现这个目标吗? 当然,我想要评估所有转义字符,所以echo $PS1在我的情况下并不是那么有用。


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

$ TEST_PS1="e[31;1mu@h:ne[0;1m$ e[0m"
$ RANDOM_STRING=some_random_string_here_that_is_not_part_of_PS1
$ script /dev/null <<-EOF | awk 'NR==2' RS=$RANDOM_STRING
PS1="$TEST_PS1"; HISTFILE=/dev/null
echo -n $RANDOM_STRING
echo -n $RANDOM_STRING
exit
EOF
<prints the formatted prompt properly here>

script命令生成一个指定的文件&输出也显示在标准输出。 如果省略filename,它会生成一个名为typescript的文件。

由于在这种情况下我们对日志文件不感兴趣,所以filename被指定为/dev/null 。 相反,脚本命令的stdout被传递给awk进行进一步处理。

  • 整个代码也可以封装成一个函数。
  • 另外,输出提示也可以分配给一个变量。
  • 这种方法也支持解析PROMPT_COMMAND ...
  • 编辑:
    看起来,新版本的script stdin了打字稿中的管道stdin 。 为了解决这个问题,上述机制可以改为:

    $ TEST_PS1="e[31;1mu@h:ne[0;1m$ e[0m"
    $ RANDOM_STRING=some_random_string_here_that_is_not_part_of_PS1
    $ script /dev/null <<-EOF | awk '{old=current; current=$0;} END{print old}' RS=$RANDOM_STRING
    PS1="$TEST_PS1"; HISTFILE=/dev/null
    alias $RANDOM_STRING=true
    $RANDOM_STRING
    $RANDOM_STRING
    EOF
    
    <prints the formatted prompt properly here>
    

    说明:

    尝试在终端上手动输入这些命令。 将这些命令按原样复制到heredoc ,并用鼠标中键单击进行粘贴。 脚本命令的stdout将包含非常相似的东西。

    例如对于上面的情况,脚本命令的输出给出了这个:

    PS1="e[31;1mu@h:ne[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;1mu@h:ne[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_is_not_part_of_PS1”作为分隔符(awk的记录分隔符)分割stdout并打印最后一个记录。

    EDIT2:

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

    $ gdb -batch -p $$ -ex 'call bind_variable("expanded_PS1", decode_prompt_string (get_string_value ("PS1")), 0)'
    $ echo "$expanded_PS1"
    <prints the formatted prompt properly here>
    
  • 尽管这里有一个小问题。 PS1[]字符串将分别打印为1 / 2 。 你可以用tr -d '12' <<< "$expanded_PS1"删除那些tr -d '12' <<< "$expanded_PS1"
  • 如果你得到像gdb这样的错误无法附加到进程(似乎发生在ubuntu: - ),用sudo运行gdb

  • 另一种方法是, 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[@]}"
    

    曾经讨论过关于这个GitHub问题。


    尝试下面的命令

    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
    
    链接地址: http://www.djcxy.com/p/78031.html

    上一篇: How to print current bash prompt?

    下一篇: How behaves f:view with many defined resource library contracts?