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)内部的命令都将从中读取输入stdin
function1
stdin
function1
stdin
类似地,<( command2 "$OTHER_DETAILS" )
连接到stdout
of command2
(我假设它是脚本内的一个函数)。任何echo
以及许多其他人都可以从 的代码内部printf
写入此类内容。stdout
command2
最终结果是ifstderr
内执行的代码 (2>)if
连接到脚本内的某些其他代码。并且, 的输出command2
也连接到 内部的代码if
(根据您提供的代码判断,该代码必须是 command1 )。
两个重定向都与此代码类似(不完全相等):
command2 | command1
command1 2>1 | function1