实在不知道怎么起这个标题了…..
主要问题的是如果在命令行打上了中文,然后用按住backspace删除的时候会把PS1打出来的也一起删除掉….
就是以上的效果,这个问题困扰我好久,刚开始以为是自定义PS1的问题.试了好久也没有找到问题
奇怪的是,同样的PS1配置,在有一些机器上没问题,有一些机器有问题…..对比了一下不同,可以正常删除文字的机器上配置了LANG环境变量为en_US.UTF-8,不了解这个环境变量的同学可以去这里看一下, 不能正常删除文字的机器上LANG环境变量没有配置,尝试配置上以后就OK了…
困扰多年的问题啊……
原因是啥呢?
可以看到”我现在要删除了” 这7个中文会转成unicode, 由于我用的SecureCRT 客户端里配置了以UTF8格式输入,所以每个中文占3个字符
在未配置LANG环境变量的时候,我们按删除键,一次只删除一个unicode字符
由于终端显示字符集和系统的字符集不一样,就会出现奇怪的情况
把LANG配置为UTF8之后就OK了
终端这里有时还会遇到另外一个奇怪的问题.就是输入一段很长的字符,无论中英文,到需要换行的时候光标会自动跑到当前行的行首….
看这个问题 : linux 输入长命令行 会无缘无故的回到行开始,本来应该在下一行继续的!
原问题: How do I get long command lines to wrap to the next line?
出现这个问题是因为,在自定义PS1的时候没有写对
也就是说,在bash中,所有在PS1中的非打印字符都必须用”\[\]”(不包括引号)将其包围起来,否则在计算提示符长度时也会将其计算在内,导致其无法正确地换行,也就出现了回到行首的情况.
if [ $(id -u) -eq 0 >/dev/null 2>&1 ]; then export PS1="[\[\033[1;31m\]\u\[\033[1;31m\]@\[\033[1;35m\]\A\[\033[1;31m\]@\[\033[1;32m\]\h:\[\033[1;35m\]\w\[\033[0m\]]\[\033[1;31m\]\$\[\033[0m\] " else export PS1="[\[\033[1;36m\]\u\[\033[1;31m\]@\[\033[1;35m\]\A\[\033[1;31m\]@\[\033[1;32m\]\h:\[\033[1;35m\]\w\[\033[0m\]]\[\033[1;35m\]\$\[\033[0m\] " fi
最后给一下 我的这个PS1的配置,喜欢的同学可以试试^_^
由于root用户和普通用户的要区别开,所以有一个root用户的判断逻辑
把这段shell放在/etc/bashrc的最后一行就对所有user都生效
引用: