我有将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我完全不熟悉脚本或这类东西。
答案 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
(或安装在何处)可能会更好。