了解 bash 中的重定向 if 语句

了解 bash 中的重定向 if 语句
if [ -z "$OPTION" ] # if option is not given(empty) then:
    then
        command1 --defaultOption
    else 
        command1 $OPTION
fi \
  2> >( function1 "$DETAILS" ) \
  < <( command2 "$OTHER_DETAILS" )

我非常困惑如何将 stderr 定向到文件并将文件输入到 stdin 中与 if 语句交互。众所周知的事情有: 2>filename# Redirect stderr to file "filename." 2>>filename# Redirect and append stderr to file "filename." command < input-file > output-file < input-file command > output-file

我的猜测是:

command2 生成一个文件,该文件使用 --defaultOption 转发到 command1 的标准输入(如果 $OPTION 为空,则为 case),或者使用 $OPTION 转发到 command1 的标准输入(如果 $OPTION 不为空,则为 case)。 command1 的 stderr 被重定向到 function1(例如,它可能是某种进度条显示)。

所以我的问题是:

括号< <和之间的空格是> >必要的吗?它实际上是附加(忽略空格)还是“双重”重定向?我错过了括号和大括号之间的相互作用>(<(?它是否会以某种方式影响 if 的评估?还是只是-z $OPTION测试过?

如果我将command2的输出文件写入磁盘,然后检查该选项并在if语句中再次读取它,我可以更好地理解发生了什么吗?

command2 "$OTHER_DETAILS" --out=file.txt
if [ -z "$OPTION]
  then
    command1 --defaultOption --in=file.txt 2>function1
  else
    command1 "$OPTION" --in=file.txt 2>function1
fi

这是我在那里找到的脚本的一部分: http://linuxtv.org/wiki/index.php/V4L_capturing/script (第 912 行至第 924 行)

答案1

<(cmd)>(cmd)是 shell 语法(称为进程替换)。它们被文件路径替换,即

cmd1 <(cmd2)

变成

cmd1 /path/to/file

文件的内容是其输出,cmd2因此只能读取但不能写入。一个例子:

start cmd:> ls -l <(echo foo)
lr-x------ 1 hl hauke 64  5. Jan 03:49 /dev/fd/63 -> pipe:[3125128]

在这种情况下ls视为/dev/fd/63一个论点。在您的情况下,此路径成为重定向的一部分。因此,空格是强制性的。> >(cmd)是“将 stdout 重定向到临时文件,该文件的内容成为 cmd 的输入”,而>>(cmd)会导致错误,因为 shell 需要在>>. >>'(cmd)'“有效”,因为现在(cmd)被视为一个文件:

start cmd:> echo foo >>'(cat)'

start cmd:> cat \(cat\) 
foo

答案2

A>( )是一个称为“进程替换”的习语,用于替换“文件位置”的某些代码或函数。

正在连接>( function1 "$DETAILS" )到。从名称来看,我假设 function1 是您正在使用/阅读的脚本中已经定义的函数(在使用该函数之前读取的代码中)。任何选择连接到(很多时候是 cat)内部的命令都将从中读取输入stdinfunction1stdinfunction1stdin

类似地,<( command2 "$OTHER_DETAILS" )连接到stdoutof command2(我假设它是脚本内的一个函数)。任何echo以及许多其他人都可以从 的代码内部printf写入此类内容。stdoutcommand2

最终结果是ifstderr内执行的代码 (2>)if连接到脚本内的某些其他代码。并且, 的输出command2也连接到 内部的代码if(根据您提供的代码判断,该代码必须是 command1 )。

两个重定向都与此代码类似(不完全相等):

command2     | command1
command1 2>1 | function1 

相关内容