【问题标题】:Cygwin shell doesn't execute .bashrcCygwin shell 不执行 .bashrc
【发布时间】:2012-03-22 03:13:19
【问题描述】:

启动 cygwin shell 后,它只是定位在错误的主目录中:

xfire@codingme.com ~
$ pwd
/cygdrive/c/Users/xfire

但它曾经是 /home/xfire

xfire@codingme.com /etc
$ cat passwd | grep xfire
xfire:unused:22773:10513:U-CORP\xfire,S-1-5-21-527237240-725345543-682003330-12773:/home/xfire:/bin/bash

而且/home/xfire中的.bashrc没有被执行,即使我把它复制到/cygdrive/c/Users/xfire,也不行!

【问题讨论】:

标签: shell cygwin


【解决方案1】:

在 cygwin 上,我将其添加到我的 ~/.bash_profile

. ~/.bashrc

【讨论】:

  • 这为我解决了。也许您可以澄清发生了什么,以及为什么 Evans Y. 愿意接受他的回答?
  • 对于其他可能好奇的人。 cygwin 默认终端程序是 mintty。如果您检查用于启动终端的图标的属性,您会发现它以一个单独的“-”结尾。这告诉 mintty 将 shell 作为登录 shell 运行。如果 shell 不是 登录 shell,则 Bash 只会执行 .bashrc。对于登录 shell,它只执行 .bash_profile(或 .profile)。在许多其他 unix 中,终端程序将 shell 作为非登录 shell 启动,因此它们默认执行 .bashrc 而不是 .bash_profile。
【解决方案2】:

一些程序在 Windows 注册表中添加了一个“HOME”环境并将值设置为“C:\Users\xfire”,这就是 cygwin 将该目录作为主目录的原因。 cygwin.com/faq-nochunks.html

【讨论】:

  • 太糟糕了,这是您自己的答案,因此当您选择它作为正确答案时,它并没有被排在首位,因为如果 HOME 变量不是设定你的期望。
  • 我的意思是,如果我删除它,我知道它可以工作,但如果我仍然在 Windows 中的 HOME 呢?
  • 谢谢,就是这样。就我而言,这个“HOME”环境变量设置为“%USERPROFILE%”。在 cmd 中,“回显 %USERPROFILE%”:C:\Users\myuser.所以 .bashrc 和 bash_profile 文件必须在那里。但像我一样,你可能不需要它们,只需编辑 cygwin 系统文件“C:\cygwin64\etc\bash.bashrc”
  • 如果您使用 Cygwin 主文件夹,则将“HOME”设置为“C:\cygwin\home\xfire”。它将自动获取.bashrc
  • 非常感谢。这真的很令人困惑,因为即使我回应 $HOME,/cygdrive/c/users/myname 看起来很像/home/myname。如果它说C:\Users\myname,我会马上注意到。
【解决方案3】:

在我的 cygwin 版本中,我发现只有 ~/.profile 被执行,所以添加了

if [ -e "${HOME}/.bash_profile" ]; then
    source "${HOME}/.bash_profile"
fi

.profile 文件。我的.bash_profile 文件包含.bashrc 的另一个测试并从那里执行。我还在我的.bashrc 文件中添加了以下两行。

export BASH_ENV="${HOME}/.profile"
export ENV="${HOME}/.profile"

第一个确保.profile 在非交互式终端中执行,第二个确保它在 POSIX 终端中执行。我在Bash Reference Manual 中找到了关于运行什么以及何时运行的非常有用的解释。

在您的情况下,这无济于事,因为您的 HOME 环境变量的值存在问题,但在搜索此问题时,此页面在列表中的排名很高。

【讨论】:

    【解决方案4】:

    您也可以设置 BASH_ENV 变量,例如,BASH_ENV='C:\DOCUME~1\dwyttenb\.bashrc'

    【讨论】:

    • 这可能非常危险。 BASH_ENV 仅用于非交互式、非登录 shell(bash 在没有 -i--login 的情况下启动)。例如,如果您从编辑器调用 shell 命令,例如 makeBuild 脚本。它应该设置为BASH_ENV=~/.bash_env
    • 我知道文档是怎么说的,但我不明白其中的风险。
    • BASH_ENV、.bashrc.bash_profile 背后的规则经过深思熟虑。如果你想执行.bashrc,为什么不简单地运行bash -i?当编辑器或 IDE 运行 bash -c CMD 或运行远程命令 ssh root@host bash -c CMD 时,BASH_ENV 很有用。在这些情况下,shell 不是交互式的。对于BASH_ENV=~/.bash_env,它只能在~/.bash_env 中设置PATH 等,但不能定义函数、别名或PS1。风险更小。
    【解决方案5】:

    ~/.bash_profile 在初始命令提示符返回给用户之前执行。之后,每次打开新的 shell 时,都会执行 ~/.bashrc

    ~/.bash_profile 末尾添加. ~/.bashrc 已解决问题。

    现在您可以使用alias 命令检查现有别名。

    github 上查找更多详细信息。

    【讨论】:

      猜你喜欢
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-28
      • 2012-12-13
      • 2012-05-29
      • 1970-01-01
      • 2019-08-07
      相关资源
      最近更新 更多