AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 984060
Accepted
Smile
Smile
Asked: 2017-12-08 02:19:08 +0800 CST2017-12-08 02:19:08 +0800 CST 2017-12-08 02:19:08 +0800 CST

"export PS1=" 用于自定义 shell 提示

  • 772

我想自定义我的 shell 提示符以包含时间。所以,我做到了export PS1='\t\w\$'。

我的提示现在看起来像18:57:37~$. 我不知道如何在它前面加上username@hostname.

另外,我不知道如何更改 、 等的每个参数的\t颜色\w。

经过所有测试后,如何将其设置回默认值?

最后,出口线去哪儿了?我看了看~/.profile,但没有线路export PS1='\t\w\$'。

command-line
  • 1 1 个回答
  • 40270 Views

1 个回答

  • Voted
  1. Best Answer
    Zanna
    2017-12-08T03:01:08+08:002017-12-08T03:01:08+08:00

    PS1设置在您的~/.bashrc. 该文件包含将应用于每个交互式 shell 的设置。当您在 Ubuntu 中打开终端时,您会得到一个交互式 Bash shell,除非您为您的用户设置了不同的默认 shell。

    在交互式 shell 中,我们需要一个提示符,如果提示符能像 UbuntuPS1那样为我们提供一些有用的信息,比如当前工作目录、当前用户和主机名,那就太好了。

    这是在我的系统PS1的默认版本中设置的行,.bashrc/etc/skel/.bashrc

    # uncomment for a colored prompt, if the terminal has the capability; turned
    # off by default to not distract the user: the focus in a terminal window
    # should be on the output of commands, not on the prompt
    #force_color_prompt=yes
    
    if [ -n "$force_color_prompt" ]; then
        if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
            # We have color support; assume it's compliant with Ecma-48
            # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
            # a case would tend to support setf rather than setaf.)
            color_prompt=yes
        else
            color_prompt=
        fi
    fi
    
    if [ "$color_prompt" = yes ]; then
        PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    else
        PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    fi
    unset color_prompt force_color_prompt
    

    从PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '你可以看到转义码username和分别hostname是\u和\h

    zanna@toaster:~$ PS1="\u@\h"
    zanna@toaster
    

    如果要添加时间和当前工作目录:

    zanna@toasterPS1="\u@\h \t \w "
    zanna@toaster 10:43:32 ~ 
    

    要获得颜色,您需要使用颜色转义序列。您可以在 color_prompt 分配中看到一些.bashrc

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    

    例如,\033[01;34m是蓝色的:

    PS1 分配

    哎呀!现在后面的文字也是蓝色的......最好把它改回白色:

    带有颜色重新分配的 PS1

    我们应该用转义的方括号包围颜色分配,否则 Bash 会认为它们正在打印提示符并使用它们来计算其大小。当您尝试与您的历史交互时,这会产生奇怪的效果,所以这里是更正的版本:

    PS1="\[\033[01;34m\]\u@\h \t \w \[\033[00m\]"
    

    播放完毕后,您可以通过关闭终端并打开一个新终端来将提示恢复为默认值;)或运行

    source ~/.bashrc
    

    我的 PS1 恢复正常

    我PS1使用已经在中的代码设置我的喜欢.bashrc,取消注释#force_color_prompt=yes并更改颜色代码。在这里您可以看到我更改为设置它的行:

    $ diff .bashrc /etc/skel/.bashrc 
    46c46
    < force_color_prompt=yes
    ---
    > #force_color_prompt=yes
    60c60
    <     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '
    ---
    >     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    

    (在此之后有更多行更改,但它们不相关)

    你可以做同样的事情,但是在某处添加一个\t到color_prompt行中,例如

    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h \[\033[01;36m\]\t \[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '
    

    有关颜色和更多内容的 ANSI 转义码列表,请参阅自定义提示的本指南。


    我忽略了回答你问题的最后一部分。

    最后,出口线去哪儿了?我查看了~/.profile,但没有行导出PS1='\t\w\$'

    我不确定您是否期望运行export VAR=val会导致您~/.profile被自动修改。该export命令从不这样做。导出变量只会将其传递到从当前 shell 运行的命令的环境中。当您退出 shell(并且它的所有子进程都已退出)时,您从 shell 导出的任何内容都消失了。

    如果要永久设置环境变量,一般需要~/.profile显式添加。您可能用于安装软件的某些脚本可能会修改您的~/.profile或其他 shell 配置文件。

    但PS1不需要导出到环境中。在我的回答开始时,我说在交互式 shell 中我们需要提示,我的意思是只有交互式 shell 需要提示(因为提示有助于用户与 shell 交互)。不需要其他命令PS1。

    PS1您可能会认为传递给当前 shell 的任何子 shell可能很有用。当你在一个 shell 中运行一个交互式 shell 时bash,新的 shell 不会继承调用 shell 的 shell 变量;只有它的环境变量。因此,要将变量传递给子 shell,我们应该使用export它们。

    但是导出PS1通常* 无法将其值传递给子 shell,因为它由 shell 的配置文件重置,/etc/bash.bashrc并且~/.bashrc. 因此,没有必要关闭终端(正如我之前建议的那样);即使运行bash也会将您的提示返回到其通常的形式:

    zanna@toaster:~$ export PS1='\t -> '
    22:43:54 -> bash
    zanna@toaster:~$ 
    

    (如果你是exit这个 shell,编辑后的提示会回来)

    * 我说通常是因为,虽然非交互式 shell总是unset PS1,但交互式 Bash shell 将保留设置的值PS1。这并不明显,因为如前面的示例所示,它通常由配置文件重置。我们可以通过更改PS1然后启动一个不读取我们的配置文件的新 shell 来发现它:

    zanna@toaster:~$ export PS1='\t -> '
    22:55:04 -> bash --norc
    22:55:09 -> 
    

    因此,总而言之,没有inexport行,因为它不是环境变量,也没有业务是一个,因为只有交互式 shell 需要它,并且由于交互式 shell 需要,它被设置为 in ,因为除非被告知不要,所有交互式 Bash shell ,因此不需要由子 shell 继承(但如果您确实想要某些值而不是子 shell 中的值,您可以通过阻止该 shell 采购来做到这一点)。PS1~/.profilePS1PS1~/.bashrcsource ~/.bashrc~/.bashrcexport PS1exportPS1.bashrc.bashrc


    感谢 Eliah Kagan,我能够扩展我的答案,他在聊天中解释了 Bash 如何处理 PS1,并在这个答案中更详细地解释了。

    • 11

相关问题

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • 如何从命令行刻录双层 dvd iso

  • 如何从命令行判断机器是否需要重新启动?

  • 文件权限如何工作?文件权限用户和组

  • 如何在 Vim 中启用全彩支持?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve