首页 > 解决方案 > 为什么在我关闭文件描述符并想要回显一些文本后,我有错误的文件描述符?

问题描述

我想在 if 条件下重定向文本。我打开两个文件描述符并关闭它们。一切正常,结果被重定向到文件。但是当我想在 if 条件之后回显一些文本时,它会抛出一个错误:错误的文件描述符。怎么了?

echo "Enter the number between 5 and 10"
read number

if  [[ $number -le 5 || $number -ge 10 ]]

 then
    
echo "There is an error!"
    
#open file descriptor

    exec 2>error.txt
    echo "---------------------" >&2
    echo "Your answer is $number" >&2
    echo "I wanted you to enter number between 5 and 10!" >&2
    exec 2>&-
else
    
echo "You are really good!"

    #open file descriptor

    exec 1>output.txt
    echo "---------------------"
    echo "You are so cool! Your answer is correct!"
    echo "Your answer was $number"
    exec 1>&-
fi

echo "Some text"

标签: bash

解决方案


1是标准输出的文件描述符。任何命令,例如echo“默认”写入标准输出。>之前没有数字的重定向>,就像>&3重定向命令的标准输出,重定向第一个文件描述符。IE。echo >&3正好等于echo 1>&3

在您关闭标准输出exec 1>&-之后,下一个写入标准输出的命令echo "Some text"会出错 - 因为标准输出已关闭。

因此,对于自定义文件描述符,请使用大于或等于的数字,3以免干扰标准输出1或标准错误2

但是......只需将语句分组:

{
   echo "---------------------"
   echo "Your answer is $number"
   echo "I wanted you to enter number between 5 and 10!" 
} > error.txt

推荐阅读