首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >if ()< /dev/null

if ()< /dev/null
EN

Stack Overflow用户
提问于 2012-09-11 14:28:58
回答 2查看 7.6K关注 0票数 18

我不能理解这件事。为什么要将/dev/null用作if语句的输入?< /dev/null在以下内容中的用途是什么?

代码语言:javascript
复制
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
        $PROG
else
        echo "failed"
        exit 1
fi

我认为我理解> /dev/null 2>&1只是用来抑制来自stdoutstderr的任何输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-11 14:33:54

如果$PROG是一个需要来自stdin的输入的程序,那么您的脚本可能会永远停止,等待您键入某些内容。< /dev/null的用法是为这样的程序提供一个空输入。你对>2>&1的看法是对的。

这段脚本正在检查$PROG --version是否以0状态(成功)退出,然后在没有任何标志的情况下运行该程序。如果$PROG --version失败,脚本将回显"failed“并退出。

票数 17
EN

Stack Overflow用户

发布于 2012-09-11 15:01:34

我想您可能想知道为什么重定向在括号之外。

在这一行中:

代码语言:javascript
复制
if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then

括号不是if语句语法的一部分;它们只是指定命令分组。(我自己也想起来了;在csh/tcsh中,括号是if语句语法的一部分。)

例如,如下所示:

代码语言:javascript
复制
( echo one ; echo two ) | tr a-z A-Z

将生成以下输出:

代码语言:javascript
复制
ONE
TWO

在本例中,由于$PROG --version是一个单独的命令,因此括号是不必要的(除非$PROG展开到多个命令,但这不太可能)。

因此,重定向不适用于if语句;它适用于$PROG --version。这样做的目的是不向$PROG提供输入(就像从空文件中读取一样),并丢弃它写入标准输出或标准错误的任何内容。如果$PROG是一个从标准输入读取的命令,即使使用--version调用,如果没有输入重定向,它可能会挂起等待键盘输入。

该脚本假定,只有当$PROG --version不产生错误时,才可以安全地调用$PROG (不管它是什么)。

请注意,您可以对if语句应用重定向:

代码语言:javascript
复制
if test_command ; then
    something
else
    something_else
fi < /dev/null > /dev/null 2>&1

这将重定向test_commandsomethingsomething_else的输入和输出。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12363916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档