[ -t 1 ] 检查什么?

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 cmdbash也可以读取(例如在主机上用户的登录 shell 的位置,或bash --login -c 'some code')。case $- in *i*)...是测试 shell 是否具有交互性的正确方法。

  • 请注意,shell 可以在没有 stdout 作为终端的情况下进行交互,并且 shell 可以与 stdout 上的终端不交互(就像您在终端中运行脚本而不重定向/管道输出的任何时候一样),并且 `bash` 可以读取`.bashrc` 即使不是交互式的(比如在 `ssh host cmd` 中,其中 `bash` 是主机上用户的登录 shell,或者 `bash --login -c 'some code'` 是 `.bash_profile` 来源的`.bashrc`)。`case $- in *i*)...` 是测试 shell 是否是交互式的正确方法。 (4认同)

Gil*_*il' 11

测试命令 [ -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
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 应用程序。


seb*_*sth 5

人 1 测试

-t FD

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

您的示例执行(替代运行过程中,在这种情况下bash)与zsh上如果标准输出是一个终端(而不是一个文件/管/等)上打开。