带有提示的 Linux 命令行问题

标签 linux bash shell command-line ps1

我开始管理一个基于 CentOS 的新服务器。我想更改提示,所以我写了以下命令:

PS1="\e[0;36m[`pwd`]\$\e[m "

它工作得很好。但是因为我遇到了一个烦人的问题。当我写一些很长的东西,或者使用向上箭头显示一个很长的旧命令,或者粘贴它,然后单击“home”到达行首时,光标停在命令内,向前 10 个字符的提示。例如,假设我这样写:

[/]$ git log --pretty=oneline

然后点击主页按钮,光标将停在“--”之后的“p”字母上。如果我尝试用左键移动到最前面,它会发出烦人的提示音“你已经在那儿了,伙计”......

现在,假设我写了

ls

紧接着

git log --pretty=oneline

如果我上去两次,提示会显示这个:

[/]$ git log --ls

如果我继续往上走,“git log --”永远不会消失。现在,如果我按回车键,它仍然会毫无问题地启动 ls 命令。好像只是显示问题。但是,这一直让我感到困惑......

在此先感谢您的帮助!

最佳答案

使用 \w 在 shell 提示符下打印工作目录,而不是尝试嵌入命令。

您还需要对转义序列进行转义,这样 bash 就不会尝试将它们计为打印字符。这是通过用 \[\] 将它们括起来来完成的。

所以你最终应该得到这样的东西:

PS1="\[\e[0;36m\][\w]\$\[\e[m\]"

您的提示也很紧凑,您可能需要在其中插入一些空格。关键是你已经使用括号来转义不可打印的字符。

您可以在 bash 手册页的提示部分找到这些替换的完整列表。

关于带有提示的 Linux 命令行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20447468/

相关文章:

c++ - 错误: expected primary-expression before '<' token

linux - 在 Bash shell if 语句中使用逻辑 OR

ruby-on-rails - 从 Rails 应用程序运行 shell 脚本,无论最终用户如何,它都能正常工作吗?

linux - 在 awk 中打印搜索模式

windows - 无法在 Windows 10 上提取 bash (Ubuntu)

linux - Solr merge 在 amazon ec2 上达到 io 限制

linux - 从 bash 脚本写入文件

ruby - 在 Ruby 中连续读取外部进程的 STDOUT

linux - 如何在 shell 脚本中逐行从文件中分离关键字?

shell - 如何在终端中永久设置 Vi 模式? Ubuntu