在 Bash 中重定向标准输入意味着 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
我做

高管,然后我做

$ 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

再次感谢,希望不要太长,

埃里克·

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

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

如果要在执行

exec 0<&6-之前在/tmp/lines.txt中执行命令,请参阅前面的解决方案。

此外,它可能并不明显,但您可以使用.source来实现相同的输出:

. /tmp/lines.txt
source /tmp/lines.txt

最新更新