日期:2014-05-16 浏览次数:20920 次
? ? ? ? 2009年的百度知道上有人问了同题目相同的问题(其实,是我用了这个题目).而我也遇到了相同的问题,这个问题早就出现了,只是以前一直没有理会,不过好几次输入参数过长的命令,都会出现回到行首的情况,让我感到莫名的无奈.今天,实在没有心情做公司的工作了,便想把这个问题给解决一下,也好转移一下注意力.
? ? ? ? 首先,我测试了一下虚拟终端,一直输入a,然后,又测试了纯终端(Ctrl+Alt+F1),也是输入a.我发现,长命令只有一次是回到了行首,后面的输入,其能够自动换行.于是,第一反映是看看网上是否有和我遇到相同问题的,在Google中输入关键词"Linux 长命令",返回结果的第一条就是上面的那个百度知道上提的问题,与我的情况完全相同.再看看,网友给的答案,结果却是使用反斜杠\来绕过这个问题,这个答案是不能让我满意的,不过,问题的描述中提到了终端的配置这个东西,这给了我一个方向: 应该是配置上的问题,那怎么修改配置呢?
? ? ? ? 接着,我又在Google中输入关键词"Linux 终端 配置",在查看结果的时候,我发现,原来终端的配置是修改"~/.bashrc",而这个文件我是接触过多次的,而且,通过修改该文件,我还将PS1给改了一下,让提示符更好看一点.那是不是因为修改了PS1导致了这个问题呢?于是,我打开"~/.bashrc"文件,将修改PS1变量给注释掉,然后,重新打开一个终端,再一直输入a,这次终端便能够自动换行了,而不会出现回到行首继续输入的问题了.
? ? ? ? 这下问题锁定了,但是,还不确定如何修改,我可不想将漂亮的提示符给换回去.
? ? ? ? 继续Google,这次用英文的,毕竟英语国家的人接触时间更长,而且,回答问题的人也会很多.输入关键词"Linux long command",粗略浏览了一下,就第一个好像是有用的,进去看了看,发现和我的问题不一样,还是使用反斜杠解决长命令换行的.
? ? ? ? 继续换关键词,这次在搜索时将long command用双引号括了起来,然后再加一个head,组成"linux "long command" head".嗯,结果每一个都不符合我的情况.
? ? ? ? 既然,我的问题是和PS1变量的设置有关,那试试"linux "long command" PS1"呢.哈哈,结果第一个就完全符合我的情况,点进去看看.这是Ubuntu提问区,仔细阅读了这篇名为<How do I get long command lines to wrap to the next line?>的问题帖,其中有人回答如下:
Make sure all non-printable bytes in your PS1 are contained within \[ \]. Otherwise, bash will count them in the length of the prompt. It uses the length of the prompt to determine when to wrap the line. See http://mywiki.wooledge.org/BashFAQ/053?
? ? ? ? ?也就是说,在bash中,所有在PS1中的非打印字符都必须用"\[\]"(不包括引号)将其包围起来,否则在计算提示符长度时也会将其计算在内,导致其无法正确地换行,也就出现了回到行首的情况.
? ? ? ? 不过,我对什么是非打印字符还是不太清楚,于是用看了看http://mywiki.wooledge.org/BashFAQ/053,原来颜色的转义序列符就是非打印字符.在我的PS1中就包含了不少的颜色,于是,我就耐心地将每个颜色转义序列符都用"\[\]"括起来,然后,再重新打开一个终端,仍然连续输入a.嘿,问题还真就解决了,就是这个问题!
? ? ? ? 好了,今天成功解决2009年遗留下来的历史问题,同时也解决了我这么长时间遗留的历史问题,哈哈!
? ? ? ? 下面,贡献一下我的提示符PS1设置:
PS1="\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\W\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]@\[\e[0m\]\[\e[34m\]\h\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]\$ "?