当我在 Windows 上zsh
启动时,我刚刚找到了一种启动方法bash
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
答案1
[]
是test
命令的快捷方式。
根据man test
:
-t FD
如果 FD 是与终端关联的文件描述符,则为真。
因此,如果您将 bash 作为交互式 shell 运行(终端 - 请参阅这术语解释线程),bash 将被 zsh 取代。
有关 .bash* 文件的更多信息:
当 bash 作为交互式登录 shell,或作为 带有 --login 选项的非交互式 shell,它首先从文件 /etc/profile 中读取并执行命令(如果该文件存在)。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个存在且可读的文件中读取并执行命令。启动 shell 时可以使用 --noprofile 选项来禁止此行为。
当一个登录 shell 退出,bash 从文件 ~/.bash_logout 和 /etc/bash.bash_logout 中读取并执行命令(如果这些文件存在)。
当 非登录 shell 的交互式 shell启动后,bash 读取并执行命令~/.bashrc,如果该文件存在。这可以通过使用 --norc 选项来禁止。 --rcfile 文件选项将强制 bash 从文件而不是 ~/.bashrc 读取并执行命令。
斯蒂芬·查泽拉斯评论:
请注意,shell 可以在没有 stdout 成为终端的情况下进行交互,并且 shell 可以与 stdout 上的终端进行非交互(就像您在终端中运行脚本而无需重定向/管道其输出一样),并且即使在不使用时也bash
可以读取.bashrc
交互式(例如主机上用户的登录 shell位于ssh host cmd
何处,或)。是测试 shell 是否交互式的正确方法。bash
bash --login -c 'some code'
case $- in *i*)...
答案2
这测试命令 [ -t 1 ]
检查 bash 的输出是否在终端上。此行的目的显然是在打开终端时运行 zsh,而不中断 bash 的其他使用。但做得非常糟糕。
该文件.bashrc
在三种情况下被读取:
- 当 bash 作为交互式 shell 执行时,即运行用户键入的命令而不是执行批处理命令。
- 当 bash 是非交互式由 RSH 或 SSH 守护进程运行的 shell(通常是因为您运行
ssh host.example.com somecommand
并且 bash 是您的登录 shellhost.example.com
)。 - 当它被显式调用时,例如在用户的
.bash_profile
(bash 对启动文件的选择有点奇怪)。
[ -t 1 ]
是检测交互式 shell 的一种糟糕方法。可以以交互方式运行 bash,并且标准输出不发送到终端,但这种情况很少见。更常见的是,将标准输出发送到非交互式 shell 中的终端;非交互式 shell 没有任何业务运行.bashrc
,但不幸的是 SSH 调用的 bash shell 却可以运行。有一个更好的方法: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 应用程序。