[-t 1]检查什么?


Answers:


14

[]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哪里)。是测试外壳是否交互式的正确方法。bashbash --login -c 'some code'case $- in *i*)...


4
需要注意的是外壳可以互动没有标准输出是一个终端,和外壳可以是非交互与标准输出终端(如任何时候您在终端上运行一个脚本,而不重定向/其输出作为管道),并且bash可以读取 .bashrc,即使不交互式(例如,主机上用户的登录shell 在ssh host cmd哪里bash,或来源在bash --login -c 'some code'哪里)。是测试外壳是否交互式的正确方法。.bash_profile.bashrccase $- in *i*)...
斯特凡Chazelas

@StéphaneChazelas好点。我将在回答中包含您的评论
mrc02_kr

“交互”有许多不同的定义。如果shell 认为它是交互式的,i则将进行设置(并且在可以使用进行测试if而不需要使用的现代shell中case)。但是在许多用例中,人们只在乎是否将stdout(或stdin或stderr ...)连接到终端。
马克·里德

9

测试命令 [ -t 1 ]检查是否bash的输出是在终端上。该行的目的显然是在打开终端时运行zsh,而不中断bash的其他用途。但这做得非常糟糕。

.bashrc在三种情况下读取文件:

  • 当bash作为交互式shell执行时,即运行用户键入的命令而不是执行批处理命令。
  • 当bash是由RSH或SSH守护程序运行的非交互式 shell(通常是因为您运行ssh host.example.com somecommand并且bash是on的登录shell host.example.com)。
  • 当显式调用它时,例如在用户的情况下.bash_profilebash选择启动文件有点奇怪)。

[ -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。
StéphaneChazelas 17

5

男子1测试

-t FD

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

如果在终端(不是文件/管道/等)上打开了stdout,那么您的示例将bash使用zshon 执行(在这种情况下,替换为正在运行的进程)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.