如何打印当前的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?