[-t 1] 检查什么?

[-t 1] 检查什么?

当我在 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 是否交互式的正确方法。bashbash --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 是您的登录 shell host.example.com)。
  • 当它被显式调用时,例如在用户的.bash_profilebash 对启动文件的选择有点奇怪)。

[ -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 应用程序。

答案3

人1测试

-tFD

文件描述符 FD 在终端上打开

您的示例使用on if执行(在本例中替换正在运行的进程bashzsh标准输出在终端上打开(不是文件/管道/等)。

相关内容