【问题标题】:What does "if [ -t 1 ]" do in shell scripting?"if [ -t 1 ]" 在 shell 脚本中做了什么?
【发布时间】:2018-05-05 03:34:26
【问题描述】:

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

if [ -t 1 ]; then 
exec zsh 
fi

if [ -t 1 ] 命令在这里具体做了什么?

【问题讨论】:

标签: bash shell terminal scripting


【解决方案1】:

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

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

if [ -t 1 ]; then 
exec zsh 
fi

if [ -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(或安装它的任何位置)可能会更好。

【讨论】:

    【解决方案2】:

    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@
    猜你喜欢
    • 2016-06-20
    • 1970-01-01
    • 2015-05-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多