我刚刚找到了一种从Windows zsh
启动bash
Windows 时启动的方法
https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/。
建议在的末尾添加以下代码.bashrc
。
# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi
什么[ -t 1 ]
意思
这是真的吗?
然后,我可以这样做吗?
exec zsh
我刚刚找到了一种从Windows zsh
启动bash
Windows 时启动的方法
https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/。
建议在的末尾添加以下代码.bashrc
。
# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi
什么[ -t 1 ]
意思
这是真的吗?
然后,我可以这样做吗?
exec zsh
Answers:
[]
是test
命令的快捷方式。
根据man test
:
-t FD
如果FD是与终端关联的文件描述符,则为true。
因此,如果将bash作为交互式外壳程序运行(终端-参见该线程以了解术语说明),则bash将被zsh取代。
有关.bash *文件的更多信息:
当bash作为交互式登录shell或使用--login选项作为 非交互式shell调用时,它首先从文件/ etc / profile中读取并执行命令(如果该文件存在)。读取该文件后,它将按该顺序查找〜/ .bash_profile,〜/ .bash_login和〜/ .profile,并从存在且可读的第一个命令中读取并执行命令。启动外壳程序时,可以使用--noprofile选项禁止此行为。
当登录外壳退出时,bash从〜/ .bash_logout文件和/etc/bash.bash_logout文件(如果存在)中读取并执行命令。
启动不是登录shell的 交互式shell时,bash从〜/ .bashrc读取并执行命令(如果该文件存在)。使用--norc选项可以禁止这种情况。--rcfile file选项将强制bash从文件而不是〜/ .bashrc中读取并执行命令。
StéphaneChazelas评论:
请注意,shell可以在stdout不成为终端的情况下是交互式的,并且shell可以与stdout上的终端不交互(例如,任何时候在终端中运行脚本而无需重定向/输出其输出),并且bash
可以.bashrc
即使不是交互式的,也可以读取(例如,主机上用户的登录shell 在ssh host cmd
哪里)。是测试外壳是否交互式的正确方法。bash
bash --login -c 'some code'
case $- in *i*)...
i
则将进行设置(并且在可以使用进行测试if
而不需要使用的现代shell中case
)。但是在许多用例中,人们只在乎是否将stdout(或stdin或stderr ...)连接到终端。
该测试命令 [ -t 1 ]
检查是否bash的输出是在终端上。该行的目的显然是在打开终端时运行zsh,而不中断bash的其他用途。但这做得非常糟糕。
.bashrc
在三种情况下读取文件:
ssh host.example.com somecommand
并且bash是on的登录shell host.example.com
)。.bash_profile
(bash选择启动文件有点奇怪)。[ -t 1 ]
是检测交互式外壳的一种糟糕方法。可以(但很少)以标准输出交互运行bash,而不将其输出到终端。将标准输出发送到非交互式外壳中的终端更为常见。非交互式外壳没有业务运行,.bashrc
但不幸的是,SSH调用了bash外壳。有一种更好的方法:bash(和任何其他sh风格的shell)提供了一种内置的,可靠的方法来执行此操作。
case $- in
*i*) echo this shell is interactive;;
*) echo this shell is not interactive;;
esac
因此,应写成“如果是交互式shell,则启动zsh”
case $- in
*i*) exec zsh;;
esac
但这并不是一个好主意:它阻止打开bash shell,即使您使用zsh也很有用。不用理会此博客文章,而只需配置您的快捷方式即可打开终端以运行zsh而不是bash。不要进行任何安排,以使“无论何时在Windows上打开Bash应用程序,它现在都将以Zsh Shell启动”:当您需要zsh时,请打开Zsh应用程序。
rsh
/ ssh
和交互式shell,它不是登录shell。对于登录外壳程序(sshd
不会启动非交互式登录外壳程序,但是您可以使用来完成此操作ssh host exec bash -l
),.bash_profile
而是改为读取。另请注意,对于rsh
/ ssh
,还需要$SHLVL
取消设置或为0。
bash
可以读取.bashrc
,即使不交互式(例如,主机上用户的登录shell 在ssh host cmd
哪里bash
,或来源在bash --login -c 'some code'
哪里)。是测试外壳是否交互式的正确方法。.bash_profile
.bashrc
case $- in *i*)...