我可以在Cygwin中强制XTerm.exe的默认BASH Shell和其他非登录shell加载〜/ .bashrc吗?

时间:2016-04-28 20:53:27

标签: bash shell cygwin .bash-profile xterm

我遇到Cygwin的问题,特定于XTerm.exe个会话未正确加载BASH个配置文件。

对于初学者,我的.startxwinrc是:

#!/bin/sh

xrdb -merge ~/.Xresources
xterm -geometry +0+60 -ls &
xterm -geometry +0-100 &
exec  xclock

...而我的.Xresources是:

Xft*antialias:          true
Xft*autohint:           true
XTerm*background:   white
XTerm*foreground:   black
XTerm*cursorColor:  orchid
XTerm*fullCursor: true
XTerm*reverseVideo: false
XTerm*geometry:   80x40
XTerm*scrollBar:    true
XTerm*rightScrollBar:   true
XTerm*scrollTtyOutput: off
XTerm*scrollKey: on
XTerm*reverseWrap: true
XTerm*saveLines:    10000
XTerm*faceName:     BitStream Vera Sans Mono
XTerm*faceSize:     12
XTerm*toolBar:      off
XTerm*VT100.Translations: #override\n\
        <Key>BackSpace: string(0x7F)\n\
        <Key>Delete: string("\033[3~")\n\
        <Key>Home: string("\033[1~")\n\
        <Key>End: string("\033[4~")\n\
        <KeyPress>Prior : scroll-back(1,page)\n\
        <KeyPress>Next : scroll-forw(1,page)

我将我的X服务器启动为:

startxwin &

我看到上面的配置有效......我得到两个XTerm窗口和一个xclock(颜色和滚动等等都符合我的规格)。

但奇怪的是终端提示不是我在~/.bashrc配置文件中设置的。

起初我认为我的问题与这些问题有关:

Why is my .bashrc not read under cygwin?
Cygwin shell doesn't execute .bashrc

...这表明问题是实际配置设置可能是从~/.profile~/.bash_profile加载的。但添加这些没有任何作用。

要验证它们没有运行,我在我的主目录中为这三个bash配置文件(.bashrc.bash_profile.profile中的每一个添加了这样的行:< / p>

echo "**** EXECUTING /home/JasonMick/.bash_profile *****" | \
    tee -a /tmp/shell.log

永远不会写文件......所以很明显这些文件永远不会被触及。

接下来我验证了我的Windows环境变量中没有“HOME”变量(有些人认为这可能是此类问题的根源)。没有这样的变量,所以我在这方面没问题。

接下来,我使用...验证了有关shell状态的一些基本知识。

printf '%s\n' $SHELL $HOME $USER

XTerm的结果是:

  

/斌/庆典
  /家庭/ JasonMick
  JasonMick

这些结果与非X11终端mintty(我通常用于启动startxwin)中执行的相同命令的结果相同。但是,根据我的主目录mintty文件中的设置,当我打开新的.bashrc时,提示是正确的。

为了安全起见,我搜索了.profile中的.bashrc.bash_profile/etc/个文件。我找到了以下文件:

/etc/profile
/etc/bash.bashrc
/etc/skel/.bashrc
/etc/skel/.bash_profile
/etc/defaults/etc/skel/.bashrc
/etc/defaults/etc/skel/.bash_profile
/etc/defaults/etc/bash.bashrc
/etc/defaults/etc/profile

我为所有人添加了打印件。

简而言之,我/etc/shell.log文件获得以下命令:

  

**** EXECUTING / etc / profile ****
  **** EXECUTING /etc/bash.bashrc *****
  **** EXECUTING /home/JasonMick/.bash_profile *****

...所以它似乎在调用/etc/文件,然后最终自动调用我的主目录中的.bash_profile,而没有来自/etc/所有配置文件的任何源调用

删除日志,我启动startxwin。 Xterm打开,但日志文件不存在!

这意味着XTerm没有触及任何配置文件..不在/etc/而不在${HOME}中!

我发现的唯一区别是,在echo $0 $-中调用mintty时,我得到了:

  

-bash himBH

...我在XTerm中得到的地方:

  

bash himBH

根据以下信息:

Difference between Login Shell and Non-Login Shell?
Why 'echo $0' gives different result for two different terminals?

我在Xterm中的bash shell是交互式$-中的 i 标志)非登录(没有 - at at $0} BASH shell的前面,而我的mintty迭代登录 BASH shell。< / p>

好。根据上面的第二个链接,我仍然希望我的非登录 交互式 shell加载我的〜/ .bashrc。但同样,如上所述,它不仅不加载该文件......就我所知,它们并没有加载任何bash配置文件。 ${HOME}中没有{... 1}}中没有。

知道如何强制Cygwin中的非登录 shell(即/etc/默认shell会话)来正确搜索XTerm~/.bashrc

我做错了吗?

2 个答案:

答案 0 :(得分:1)

您可能也注意到了这一点: Run xterm with login shell or not? ,它指出xterm的loginShell资源可以用来告诉它充当登录shell。

另外,根据Cygwin FAQ,未设置(或设置不正确)HOME变量会在启动时干扰.bashrc的采购。常见问题解答提到了一些typical problems with HOME

答案 1 :(得分:0)

我发现在Cygwin中我可以通过在export ENV=~/.bashrc文件中调用.startxwinrc来获取非登录 shell来加载其配置设置。新的.startxwinrc文件是:

#!/bin/sh
export ENV=~/.bashrc
xrdb -merge ~/.Xresources
xterm -geometry +0+60 -ls &
xterm -geometry +0-100 &
exec  xclock

打扰xterm个会话及其子女现在可以正确地找到我的~/.bashrc

线程Difference between Login Shell and Non-Login Shell?中的@Gilles声明:

“当你在现有会话(屏幕,X终端,Emacs终端缓冲区,另一个shell中的shell,...)中的终端中启动shell时,你会得到一个交互式,非登录 shell。可能会读取一个shell配置文件(~/.bashrc,用于为{1}}调用bash,bash/etc/zshrc用于zsh,~/.zshrc/etc/csh.cshrc用于csh, ~/.cshrc变量指示的ENV变量指示的文件,如sh调用的短划线,ksh和bash,如果设置为$ENV,则为mksh ~/.mkshrc等。)。“

当我第一次阅读时,第一个条款似乎建议自动为非登录 shell加载~/.bashrc。虽然第二个子句确实声明可以定义变量ENV来设置bash的配置文件位置,但是第一个子句的语言使得不清楚这是必要的还是有时是必要的?根据我的发现,对于某些平台,“有时”可能是正确的,其中默认GUI文件包含调用以导出与默认shell的配置文件对应的ENV变量。

@ ThomasDickey对相关问题的链接解决方案帮助我重新评估了上面引用的@Gilles答案。但是,他建议将我的XTerm来电更改为登录,这不是我认为最好的答案,因为我唯一关注的不一样就是无法自动加载shell配置,我的修复补救了非登录 shell。

uptime和某些其他报告调用的调用存在差异Difference between...状态,但这些并不是我对我的用例感到担忧的问题。我的部署是使用Cygwin的单用户本地部署,无意接受对我的计算机的传入ssh呼叫。因此,没有令人信服的理由我发现不采用更简单的一行修复,它通过${ENV}将适当的配置文件应用于所有XTerm,而不是为每个XTerm添加一个标志的更详细的修复{{1}}致电,告诉它以登录模式启动其外壳。