在shell翻译中“if [-t 1]”有什么作用?

时间:2017-11-21 15:43:22

标签: bash shell terminal scripting

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

getDivWidth(event:Event) { // event parameter is optional it could be blank as well
  // Return your appropriate width 
}

命令if [ -t 1 ]; then exec zsh fi 到底在做什么?

P.S我完全不熟悉脚本或这类东西。

2 个答案:

答案 0 :(得分:2)

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

命令[ ... ]旨在取代您在传统编程语言中找到的布尔表达式。如果这些选项评估为真值,它有多个选项用于括号和退出之间的内容,0 =成功。

特定子命令-t测试文件描述符以查看它是否附加到终端。文件描述符1是脚本输出的地方(也就是“标准输出”或“标准输出”)。所以-t 1为真,当且仅当脚本的输出发送到终端(而不是文件或管道或其他东西)时,[ -t 1 ]才会返回成功。

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

答案 1 :(得分:2)

  

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

不,你没有。这不是你的代码所做的,虽然它会产生类似的效果。

if [ -t 1 ]; then 
exec zsh 
fi
     

如果[-t 1]在这里执行命令到底是什么命令?

执行命令[ -t 1 ]。如果它以状态0退出(表示成功,对于[命令,则表示条件的计算结果为true),则执行if语句正文中的命令。

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

if test -t 1; then
  # ...

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

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