Jin*_*won 15 shell bash zsh test
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
Run Code Online (Sandbox Code Playgroud)
什么[ -t 1 ]意思?
这是真的吗?
那么,我可以这样做吗?
exec zsh
Run Code Online (Sandbox Code Playgroud)
mrc*_*_kr 18
[]是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 读取和执行命令。
Stéphane Chazelas 评论:
请注意,shell 可以在没有 stdout 作为终端的情况下进行交互,并且 shell 可以与 stdout 上的终端不交互(就像在没有重定向/管道输出的情况下在终端中运行脚本的任何时候一样),并且bash可以.bashrc即使在不交互的情况ssh host cmd下bash也可以读取(例如在主机上用户的登录 shell 的位置,或bash --login -c 'some code')。case $- in *i*)...是测试 shell 是否具有交互性的正确方法。
Gil*_*il' 11
该测试命令 [ -t 1 ]检查是否bash的输出是在终端上。此行的目的显然是在打开终端时运行 zsh,而不会中断 bash 的其他用途。但它做得非常糟糕。
.bashrc在三种情况下读取文件:
ssh host.example.com somecommand并且 bash 是您的登录 shell host.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
Run Code Online (Sandbox Code Playgroud)
所以“launch zsh if this is an interactive shell”应该写成
case $- in
*i*) exec zsh;;
esac
Run Code Online (Sandbox Code Playgroud)
但即使这样也不是一个好主意:它会阻止打开 bash shell,即使您使用 zsh,这也很有用。忘记这篇博文,只需配置打开终端的快捷方式即可运行 zsh 而不是 bash。不要把事情安排成“每当你在 Windows 上打开 Bash 应用程序时,它现在都会用 Zsh shell 启动”:当你想要 zsh 时,打开 Zsh 应用程序。
| 归档时间: |
|
| 查看次数: |
6718 次 |
| 最近记录: |