当前位置: 首页 > Linux

Linux:终端提示符(prompt)没有按预期生效原因

时间:2023-04-06 23:42:13 Linux

前言先简单介绍一下什么是提示?顾名思义,就是提示的意思。看似离我们很远,但其实只要是每一个接触过shell的童鞋都能看到,它就是我们输入命令时出现在我们面前的提示。提示字符串。举个例子:当然这个款式是可以修改的,这就涉及到我们的PS1和PS2了。有经验或者之前设定的童鞋估计都不会陌生。没有接触过的童鞋。参考链接学习:linuxPS1提示定义问题因为以上不是本次的主题,所以干脆略过。事实上,我们的提示不仅可以显示这些信息,还可以显示一些更“动态”的东西。先来看一个需求(简单):我们希望每次执行命令都看到当前时间,那么可以在~/.bash_profile中添加如下内容:exportPS1="$(date+"%Y-%m-%d%H:%M:%S")\$"如代码所示,我们应该可以在提示符上看到我们的时间,现在试试:正如我们猜测的那样,提示符已经变成了我们的时间,但似乎有问题。当我们执行下一条命令时,时间没有变化,还是40秒,即使我们执行几次,还是一样。难道PS1只能加载一次?但是这个理由很快就被否决了,因为当我们切换用户的时候,提示符的$会变成#,还有其他的例子(下面会列举)证明每次都会执行PS1。所以问题只能出在我们的写法上。考虑是否是硬编码命令,将date命令放在函数中看是否成功:修改~/.bash_profile文件如下:echo_time(){date+"%Y-%m-%d%H:%M:%S"}exportPS1="$(echo_time)\$"结果失败。看来这种用法是不能接受的!查了很多文档,直到看到一篇文章说,两边必须有单引号,才恍然大悟,开始明白为什么我的效果会失效了。这里可能有童鞋不知道linux中单引号和双引号的区别。简单来说,双引号:让大部分符号(例如*),失去意义,变成普通字符。单引号:使所有符号失去意义,成为普通字符。举个简单的例子,echo"$a"可以得到变量a的值,但是echo'$a'只能输出$a。详见。原因分析我这里失败的原因是我这里需要用单引号而不是双引号,因为如果用双引号的话,PS1在赋值的时候就已经获取了command/function的值了。所以每次打印PS1时,它已经是一个特定的值,而不是命令/函数。就像:#双引号:PS1="$(date+%F)"结果是:PS1="2017-07-24"#单引号:PS1='$(date+%F)'结果是:PS1='$(date+%F)'所以在终端输出的时候,会有不同的表现:单引号,每次输出,就是执行那个函数,而双引号,因为已经是固定的了人品,所以每次都很值!解决办法找到原因,修改起来得心应手。我们只需要改变之前的语法,将双引号改为单引号即可。修改~/.bash_profileecho_time(){date+"%Y-%m-%d%H:%M:%S"}exportPS1='$(echo_time)\$'可以看出这样已经完美解决了我们的问题问题~PS:附上一个小福利需求:如果长期在终端下开发,又是gitlab用户的童鞋,经常会担心自己开发的代码分支会错,或者自己没有记住你在哪个分支,你经常需要gitbranch来查看它。现在我们可以用它来解决我们的问题了~修改~/.bash_profile#获取代码的分支get_branch(){BRANCH=`gitbranch2>/dev/null|sed-n'/^\*/s/^\*//p'`if[[-n$BRANCH]]thenecho"[*$BRANCH]"elseecho''fi}exportPS1='\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;36m\]\W\[\033[00m\]\[\033[01;32m\]$(get_branch)\[\033[00m\]\$'运行的效果:可以看到当我进入一个代码目录时,我的提示符会显示你所在的分支~,这个功能虽小,但我觉得还是挺有用的,就像gitbash客户,我希望你喜欢它!欢迎各位大神指点交流,QQ讨论群:258498217转载请注明出处:https://segmentfault.com/a/11...