if()</ dev/null

Xu *_*ang 18 unix bash

我无法绕过这个.为什么将/dev/null用作if语句的输入?以下是什么用途< /dev/null

if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
        $PROG
else
        echo "failed"
        exit 1
fi
Run Code Online (Sandbox Code Playgroud)

我(觉得)我明白,> /dev/null 2>&1只是用来抑制来自任何输出stdoutstderr.

Car*_*rum 16

如果$PROG是一个期望输入的程序stdin,你的脚本可能永远停止等待你输入内容.使用< /dev/nullis来为这样的程序提供空输入.你说得对的>2>&1.

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


Kei*_*son 14

我想你想知道为什么重定向在括号之外.

在这一行:

if ( $PROG --version ) < /dev/null > /dev/null 2>&1; then
Run Code Online (Sandbox Code Playgroud)

括号不是if语句语法的一部分; 他们只是指定命令分组.(我花了一点时间记住了自己;在csh/tcsh中,括号if语句语法的一部分.)

例如,这个:

( echo one ; echo two ) | tr a-z A-Z
Run Code Online (Sandbox Code Playgroud)

将产生此输出:

ONE
TWO
Run Code Online (Sandbox Code Playgroud)

在这种情况下,由于$PROG --version是单个命令,因此括号是不必要的(除非$PROG扩展为多个命令,但这不太可能).

因此重定向不适用于该if语句; 它适用于$PROG --version.目的是不提供任何输入(如同从空文件中读取)$PROG,并丢弃它写入stdout或stderr的任何内容.如果$PROG是从stdin读取的命令,即使在调用时--version,也没有输入重定向,它可能会挂起等待键盘输入.

该脚本假定$PROG只有在$PROG --version不产生错误的情况下才能安全地调用(无论它是什么).

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

if test_command ; then
    something
else
    something_else
fi < /dev/null > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

这种重定向输入和输出test_command,something, something_else.