【发布时间】:2018-05-05 03:34:26
【问题描述】:
我有将 zsh 设置为默认 shell 的代码:
if [ -t 1 ]; then
exec zsh
fi
if [ -t 1 ] 命令在这里具体做了什么?
【问题讨论】:
标签: bash shell terminal scripting
我有将 zsh 设置为默认 shell 的代码:
if [ -t 1 ]; then
exec zsh
fi
if [ -t 1 ] 命令在这里具体做了什么?
【问题讨论】:
标签: bash shell terminal scripting
我有将 zsh 设置为默认 shell 的代码:
不,你没有。这不是您的代码所做的,尽管它会产生类似的效果。
if [ -t 1 ]; then exec zsh fiif [ -t 1 ] 命令在这里具体做了什么?
命令[ -t 1 ] 被执行。如果它以状态 0 退出(表示成功,对于 [ 命令意味着条件评估为真),则执行 if 语句主体中的命令。
[ 是一个命令,而不是 shell 语法的一部分,这可能有点令人惊讶,但事实就是如此。您的if 可以等效地改写为使用test 命令:
if test -t 1; then
# ...
那么,另一个关键是-t 1 部分。您可以在test 或[ 命令的手册中找到相关信息,但为了省去麻烦,它是一个条件表达式,用于评估文件描述符 1(shell 的标准输出)是否连接到终端。这与评估 shell 是否是交互式的类似,但并不完全相同。
总体而言,如果标准输出连接到终端,则提供的代码具有将当前(可能是bash)shell 替换为zsh 的效果。这是间接的,而且有点棘手;通过chsh 命令将您的登录shell 真正设置为/bin/zsh(或安装它的任何位置)可能会更好。
【讨论】:
if command; then other_command; fi 运行 command,然后,如果该命令以返回码 0(“成功”)退出,则运行 other_command。
[...] 命令旨在取代传统编程语言中的布尔表达式。它有许多选项用于括号之间的内容,如果这些选项的计算结果为真值,则以 0=success 退出。
特定的子命令-t 测试文件描述符以查看它是否附加到终端。文件描述符 1 是脚本输出的位置(也称为“标准输出”或简称“stdout”)。所以-t 1 为真,[ -t 1 ] 返回成功当且仅当脚本的输出进入终端(而不是进入文件或管道或其他东西)。
在这种情况下,当前的 shell 被 zsh 的副本替换(通过exec)。希望不会运行相同的脚本,因为zsh 以相同的方式工作并且会做出相同的决定并进入无限循环execing 本身。
【讨论】:
[...] 相当于命令test,你可以使用@ 获得所有可能的选项(-n、-z、-t ...) 987654338@