我遇到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
?
我做错了吗?
答案 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
。
~/.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}}致电,告诉它以登录模式启动其外壳。