在bash脚本中动态重定向标准输入

我试图这样做以确定是否将stdin重定向到文件:

[ ...some condition here... ] && input=$fileName || input="&0"

./myScript < $input

但这不起作用,因为当变量$ input为“&0”时,bash会将其解释为文件名。

但是,我可以这样做:

if [ ...condition... ];then

./myScript <$fileName

else

./myScript

问题在于./myScript实际上是一个长长的命令行,我不想重复,也不想为其创建函数,因为它也不那么长(不值得)。

然后我想到这样做:

[ ...condition... ] && input=$fileName || input=  #empty

cat $input | ./myScript

但这需要再运行一个命令和一个管道(即子外壳)。

还有另一种更简单,更有效的方法吗?

回答:

首先stdin是文件描述符0(零)而不是1(stdout)。

您可以复制文件描述符或有条件地使用文件名,如下所示:

[[ some_condition ]] && exec 3<"$filename" || exec 3<&0

some_long_command_line <&3

请注意,exec如果条件为假 第一个exec失败,则所示命令将执行第二个命令。如果您不希望这样做失败,则应使用if/ else

if [[ some_condition ]]

then

exec 3<"$filename"

else

exec 3<&0

fi

但是如果第一次重定向失败(在条件为真之后),则随后从文件描述符3进行的重定向将失败。

以上是 在bash脚本中动态重定向标准输入 的全部内容, 来源链接: utcz.com/qa/407616.html

回到顶部