在cygwin中跨shell标准化提示

在cygwin中跨shell标准化提示,cygwin,sh,ksh,prompt,.profile,Cygwin,Sh,Ksh,Prompt,.profile,我在为cygwin安装的不同shell之间标准化我的提示,这是一段相当长的时间 已安装的外壳: bash(默认登录shell) sh csh(tcsh,实际上) ksh zsh 我的提示在bash、csh和zsh中是标准化的,但我无法在船上获得sh和ksh 我希望在所有shell中使用的提示类似于以下内容: 20121216 15:18:04 [shell] # date and time in yellow, shell in red user@hostname pwd

我在为cygwin安装的不同shell之间标准化我的提示,这是一段相当长的时间

已安装的外壳:

  • bash(默认登录shell)
  • sh
  • cshtcsh,实际上)
  • ksh
  • zsh
  • 我的提示在bashcshzsh中是标准化的,但我无法在船上获得shksh

    我希望在所有shell中使用的提示类似于以下内容:

    20121216 15:18:04 [shell]   # date and time in yellow, shell in red
    user@hostname pwd           # user@host in green, pwd in yellow
    $                           # white
    
    我已经按照我希望的方式为bash设置了它,在
    /etc/profile
    中有以下行:

    PS1="\[\e]0;\w\a\]\n\[\e[33m\]\D{%Y%m%d %H:%M:%S} \[\e[31m\][bash]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ "
    
    我已将其设置为csh,并在
    .tcshrc
    中显示以下行:

    set prompt="\n%{\033[33m%}%Y%W%D %P %{\033[31m%}[csh]\n%{\033[32m%}%n@%M %{\033[33m%}%~\n%{\033[0m%}$ "
    
    PROMPT="
    %{$fg[yellow]%}%D{%Y%m%d} %* %{$fg[red]%}[zsh]%{$reset_color%}
    %{$fg[green]%}%n@%m %{$reset_color%}%{$fg[yellow]%}%~%{$reset_color%}
    $ "
    
    我已将其设置为zsh,并在
    .zshrc
    中显示以下行:

    set prompt="\n%{\033[33m%}%Y%W%D %P %{\033[31m%}[csh]\n%{\033[32m%}%n@%M %{\033[33m%}%~\n%{\033[0m%}$ "
    
    PROMPT="
    %{$fg[yellow]%}%D{%Y%m%d} %* %{$fg[red]%}[zsh]%{$reset_color%}
    %{$fg[green]%}%n@%m %{$reset_color%}%{$fg[yellow]%}%~%{$reset_color%}
    $ "
    
    但我似乎无法在任何地方为shksh设置默认提示。我可以同时打开它们并手动设置
    PS1=“$”
    ,但我一生都无法让它自动设置。sh提示符看起来与bash提示符完全相同,ksh提示符是乱七八糟的(我认为它不喜欢从bash继承的PS1语法)

    我尝试过但未成功的事情:

    • /etc/profile
      中设置PS1(在读取shell的case语句中 来自
      echo$0的名称
    • .kshrc
    • .shrc
    • .sh_配置文件中设置PS1
    • .profile
    当我启动其中一个shell时,cygwin似乎没有执行上面列出的文件。请注意,我只从bash中启动这些shell

    有什么想法吗?(对不起,这本书,我只是想说得更透彻一些。)

    官方的Korn shell ksh93在登录时会依次阅读/etc/profile和~/.profile

    如果
    ksh
    不充当登录shell,它将尝试读取
    $ENV
    引用的文件,如果未设置
    ENV
    ,则尝试读取
    $HOME/.kshrc

    较旧的版本(特别是sun的ksh88)遇到了鸡和蛋的情况,因为您只能在
    ~/.profile
    中设置
    ENV
    ,但之后您仍然必须自己使用
    来获取文件源$环境


    请注意,必须导出
    ENV
    PS1
    ,才能被登录后生成的ksh实例拾取(例如,从
    screen
    tmux
    )。

    不再有
    'sh'
    这样的东西了。它过去指的是原始的Bourne Shell,但现在链接到其他一些最小功能Shell,如
    ash
    bash
    、或
    dash
    。它没有您需要的功能-您可以尝试从另一个shell设置PS1,但它不会跟踪时间,也不会跟踪shell的工作目录。
    ksh
    可以使用
    PS1='$PWD$'
    跟踪当前目录--使用单引号推迟扩展
    $PWD
    ,直到
    $PS1
    得到评估。
    ksh
    的原始文档有一个添加日期和时间的技巧,但它仍然是一个(聪明的)技巧。bash escape序列在这里帮不上忙。谢谢你的信息,Henk。但我想我真正想问的是,在
    ksh
    ?+1中,我应该在哪里设置默认提示,并接受a)对
    $ENV
    的引用,以及b)您先前评论中关于
    sh
    的信息。这使得我将
    export ENV=$HOME/.kshrc
    添加到我的
    /etc/profile
    ,然后将
    export PS1=blahblahblah
    添加到~/.kshrc,这最终为未登录korn shell设置了默认提示。谢谢