shell 脚本中的“if [ -t 1 ]”有什么作用?

5 bash shell terminal scripting

我有将 zsh 设置为默认 shell 的代码:

if [ -t 1 ]; then 
exec zsh 
fi
Run Code Online (Sandbox Code Playgroud)

该命令if [ -t 1 ]在这里具体执行什么操作?

Joh*_*ger 5

我有将 zsh 设置为默认 shell 的代码:

不,你没有。这不是你的代码所做的,尽管它产生了类似的效果。

if [ -t 1 ]; then 
exec zsh 
fi
Run Code Online (Sandbox Code Playgroud)

if [ -t 1 ] 命令在这里到底做什么?

命令[ -t 1 ]被执行。如果它以状态 0 退出(表示成功,对于[命令来说意味着条件评估为 true),则if执行语句正文中的命令。

可能有点令人惊讶的是,它[是一个命令,而不是 shell 语法的一部分,但事实就是如此。您if可以等效地重写以使用该test命令:

if test -t 1; then
  # ...
Run Code Online (Sandbox Code Playgroud)

那么,另一个关键的事情就是零件-t 1test您可以在or命令的手册中找到相关信息[,但为了省去您的麻烦,它是一个条件表达式,用于评估文件描述符 1(shell 的标准输出)是否连接到终端。这与评估 shell 是否是交互式 shell 类似,但不完全相同。

总的来说,如果标准输出连接到终端,则所提供的代码具有替换当前(大概bash)shell的效果。zsh这是间接的,而且有点棘手;/bin/zsh通过命令真正将您的登录 shell 设置为(或安装它的任何地方)可能会更好chsh


Mar*_*eed 3

if command; then other_command; fi运行command,然后,如果该命令退出并返回代码 0(“成功”),则运行other_command

命令[...]旨在取代传统编程语言中的布尔表达式。对于括号之间的内容有许多选项,如果这些选项的计算结果为真值,则以 0 = 成功退出。

特定的子命令-t测试文件描述符以查看它是否附加到终端。文件描述符 1 是脚本输出的位置(也称为“标准输出”或简称“stdout”)。当且仅当脚本的输出进入终端(而不是进入文件或管道或其他东西)时,情况也是-t 1如此,并且返回成功。[ -t 1 ]

在这种情况下,当前 shell 将被替换(通过exec)为 的副本zsh。希望它不会运行相同的脚本,因为它zsh的工作方式相同,并且会做出相同的决定并进入无限循环exec