在Bash中重定向标准输入意味着Bash执行默认操作?

时间:2013-09-10 09:54:46

标签: bash

昨天我也问了这个问题。感谢所有的答案。但我仍然没有得到它。

我做了

$ exec 6<&0 0</tmp/lines.txt

我想:我的标准输入现在被重定向了。但是文件中的行也被执行了!那么只有这样做才有默认动作吗?这是我的问题。

让我们说

$ cat /tmp/lines.txt 
read i j
read i j
echo "i:$i,j:$j">/tmp/res.txt

我做了exec,之后我做了

$ cat /tmp/res.txt 
i:read,j:i j

但是当我做的时候

$ exec 6<&0 0</tmp/lines.txt;exec 0<&6 6<&-

没有任何内容被读取或执行。我可以阅读这些内容,但现在我必须自己动手,

$ exec 6<&0 0</tmp/lines.txt ;while read i j;do echo "i:$i,j:$j";done

我在终端上看到了,

i:read,j:i j
i:read,j:i j
i:echo,j:"i:$i,j:$j">/tmp/res.txt

再次感谢,我希望它不会太长,

Eric J.

1 个答案:

答案 0 :(得分:1)

exec 6<&0 0</tmp/lines.txt; exec 0<&6 6<&-

事实证明bash仍会执行指定命令或脚本中剩余的内容,然后再次读取命令的输入,这就是为什么在/tmp/lines.txt之前运行exec 0<&6 6<&-之前未读取文件/tmp/lines.txt的原因。

如果您想在exec 0<&6-执行.之前执行命令,请返回previous solution

也可能不是很明显,但您可以使用source. /tmp/lines.txt source /tmp/lines.txt 来实现相同的输出:

{{1}}