另一种可能性,使用script 实用程序(ubuntu 上bsdutils 包的一部分):
$ TEST_PS1="\e[31;1m\u@\h:\n\e[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 的文件。
由于我们对这种情况下的日志文件不感兴趣,因此文件名指定为/dev/null。而是将脚本命令的标准输出传递给 awk 进行进一步处理。
- 整个代码也可以封装成一个函数。
- 此外,还可以将输出提示分配给变量。
- 此方法还支持解析
PROMPT_COMMAND...
编辑:
似乎script 的新版本与打字稿中的管道stdin 相呼应。为了解决这个问题,可以将上述机制更改为:
$ TEST_PS1="\e[31;1m\u@\h:\n\e[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 下的这些命令,然后单击鼠标中键进行粘贴。脚本命令的标准输出将包含非常相似的内容。
例如在上述情况下,脚本命令的输出如下:
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_is_not_part_of_PS1”作为分隔符(awk 的记录分隔符)拆分该标准输出并打印最后一条记录。
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 '\1\2' <<< "$expanded_PS1"
- 如果您收到诸如
gdb failed to attach to the process 之类的错误(似乎发生在 ubuntu :-\ 中),请使用 sudo 运行 gdb。