Cygwin64:不清楚 /etc/bash.bashrc 何时运行?

Cygwin64:不清楚 /etc/bash.bashrc 何时运行?

我有一台 Windows 7 64 位 PC。我在 c:\cygwin64 目录中安装了 Cygwin 版本 2.6.0。

我很困惑,当我打开 Cygwin64 终端时配置文件会/etc/bash.bashrc运行吗?

我认为这是一个交互式登录 shell,因此根据我的理解/etc/bash.bashrc它永远不会运行。以下是我理解的链接:https://shreevatsa.wordpress.com/2008/03/30/zshbash-startup-files-loading-order-bashrc-zshrc-etc/

但在/etc/bash.bashrc文件中我可以看到环境变量PS1已设置。并且它与我使用命令时获得的值相同echo $PS1。那么这是否意味着/etc/bash.bashrc已运行?

我可能没有正确理解“交互式登录”和“交互式非登录”。如能提供任何帮助,我将不胜感激。

谢谢

答案1

当我打开 Cygwin64 终端时是否/etc/bash.bashrc运行?

简短回答:

是的。我在 bash 启动文件中添加了一些 echo 语句,并打开了 Cywin64 终端。以下是输出:

/etc/bash.bashrc
/home/DavidPostill/.bash_profile
.profile
/home/DavidPostill/.bashrc
/home/DavidPostill/.bashrc
$

由于某种原因~/.bashrc被调用两次,目前我不确定为什么。


长答案:

Cygwin64 终端的快捷方式运行以下命令:

C:\cygwin\bin\mintty.exe -i /Cygwin-Terminal.ico -

对各州的帮助mintty

$ mintty --help
Usage: mintty [OPTION]... [ PROGRAM [ARG]... | - ]

Start a new terminal session running the specified program or the user's shell.
If a dash is given instead of a program, invoke the shell as a login shell.

因此我们可以看到快捷命令末尾的命令-导致登录 shell 的运行。

接下来发生的情况取决于您的登录 shell 的设置。

假设设置为bash

  • 如果它是一个登录 shell,Cygwin 将会执行~/.bash_profile(如果它存在),否则~/.profile

    注意.bash_profile将执行~/.profile

  • 如果它是一个交互式 shell,Cygwin 将执行~/.bashrc

.profile(其他名称也有效,请参阅 bash 手册页)包含 bash 命令。当 bash 作为登录 shell 启动时,它会被执行,例如从命令 bash --login。这是一个定义和导出环境变量和 bash 函数的有用位置,这些变量和函数将由 bash 和 bash 调用的程序使用。如果需要,这是一个重新定义 PATH 的好地方。我们建议在 PATH 末尾添加“:.”,以便搜索当前工作目录(与 DOS 相反,默认情况下不搜索本地目录)。此外,为了避免延迟,您应该取消设置 MAILCHECK 或定义 MAILPATH 以指向您现有的邮件收件箱。

.bashrc 与 .profile 类似,但每次启动交互式 bash shell 时都会执行。它用于定义不通过环境继承的元素,例如别名。如果您不使用登录 shell,您可能希望将上述 .profile 的内容放在此文件中。

来源自定义 bash

答案2

答案很好地解释了登录和非登录之间的区别。总而言之,在 Cygwin 下,您已经登录并打开了一个新的终端窗口。这与您在 Linux 桌面上打开终端仿真器或使用 相同screen

答案3

当你打开 cygwin 的终端时,它总是“交互式登录”。看到c:\cygwin\cygwin.bat其中包含bash --login -i

根据bash的手册:

“如果存在 -i 选项,则 shell 是交互式的。”

而“--login”是

“使 bash 表现得像被调用为登录 shell 一样”。

你问的是/etc/bash.bashrc- 它是系统范围的初始化文件bashrc,可以被本地覆盖~/.bashrc或在用户目录没有的情况下应用~/.bashrc。当你已经在 cygwin 的终端中并尝试运行时bash- 它是非登录的,因为你已经登录了,但它是交互式会话,因为你bash不是从脚本调用的。如果你将从bash脚本调用

#!/bin/bash

echo "Hello SuperUser"

那么它是非交互式和非登录调用。这种方式根本bash不会读取任何内容。bashrc

阅读“调用”部分官方 bash 手册更好地理解如何bash解释~/.bash_profile、、、和使用它~/.bash_login的顺序。 ~/.profile/etc/bash.bashrc~/.bashrc

相关内容