为什么使用 --login 时 bash.exe 运行两次?

为什么使用 --login 时 bash.exe 运行两次?

运行 cygwin 时,我使用的快捷方式如下:

C:\cygwin\bin\bash.exe --login -i

我不清楚为什么 bash.exe 执行两次。我看到任务管理器中有两个进程正在运行。如果我将 echo 语句放在文件echo .Bashrc file has been processed底部,.bashrc我将看到 echo 输出在控制台窗口中出现两次。

在此输入图像描述

是什么原因bash.exe --login导致进程运行两次? (这是预期的行为吗?)

答案1

bash作为登录 shell 的 shell 将获取~/.bash_profile.

Marcel 的 Cygwin 系统上的文件~/.bash_profile包含以下行

[[ -z $SSH_AGENT_PID && -z $DISPLAY ]] && exec -l ssh-agent $SHELL -c "bash --login"

ssh-agent如果当前 shell 环境中没有运行此类代理并且没有可用的 X11 显示,则会启动此操作。SSH 代理将启动两个新bashshell,一个非交互式 shell 和一个登录 shell(登录 shell 将跳过上面的行,因为它已经$SSH_AGENT_PID设置)。 SSH 代理通过以 启动来替换其启动的 shell exec

bash可以看到的两个过程是

  1. ssh-agent(这是$SHELL -c)开始的,并且
  2. 一个由 开始$SHELL -c,调用bash --login

对我来说,这条线看起来可以简化为

[[ -z $SSH_AGENT_PID && -z $DISPLAY ]] && exec -l ssh-agent bash --login

这将消除ssh-agent仅用于运行的额外外壳bash --login

答案2

@Kusalananda 指出--login触发 .bash_profile 被调用。我的 .bash_profile 有以下行

[[ -z $SSH_AGENT_PID && -z $DISPLAY ]] && exec -l ssh-agent $SHELL -c "bash --login"

因此每次都会开启第二次狂欢。

相关内容