在命令行删除中文问题

实在不知道怎么起这个标题了…..

主要问题的是如果在命令行打上了中文,然后用按住backspace删除的时候会把PS1打出来的也一起删除掉….

就是以上的效果,这个问题困扰我好久,刚开始以为是自定义PS1的问题.试了好久也没有找到问题

奇怪的是,同样的PS1配置,在有一些机器上没问题,有一些机器有问题…..对比了一下不同,可以正常删除文字的机器上配置了LANG环境变量为en_US.UTF-8,不了解这个环境变量的同学可以去这里看一下, 不能正常删除文字的机器上LANG环境变量没有配置,尝试配置上以后就OK了…

困扰多年的问题啊……

原因是啥呢?

可以看到”我现在要删除了” 这7个中文会转成unicode, 由于我用的SecureCRT 客户端里配置了以UTF8格式输入,所以每个中文占3个字符

在未配置LANG环境变量的时候,我们按删除键,一次只删除一个unicode字符

末配置LANG环境变量的情况下,没按删除,按一次删除和按二次删除键输出的情况

由于终端显示字符集和系统的字符集不一样,就会出现奇怪的情况

末配置LANG环境变量的情况下 ,只按一次删除键发现中文字并没有被删除

把LANG配置为UTF8之后就OK了

配置LANG为UTF8后,按一次删除键就把文件删除了

终端这里有时还会遇到另外一个奇怪的问题.就是输入一段很长的字符,无论中英文,到需要换行的时候光标会自动跑到当前行的行首….

看这个问题 : 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都生效

引用:

Leave a Reply

Your email address will not be published. Required fields are marked *