bash - 为什么在我关闭文件描述符并想要回显一些文本后,我有错误的文件描述符?
问题描述
我想在 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"
解决方案
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
推荐阅读
- java - 即使达到该行的最大限制,如何不跨行拆分单词?
- c# - 可以将子类添加到列表中吗
在 C# 中? - mongodb - 如何用 mongoose 完全替换 mongo 文档中的模式
- mysql - 2个表成员和人员的SQL JOIN
- laravel - 自己的请求,除了 laravel 中的字段
- multithreading - 警告 C28112:通过互锁函数访问的变量必须始终通过互锁函数访问
- authentication - CakePHP 4 身份验证
- python - 如何以编程方式将根文件夹添加到每个脚本的路径?
- c++ - 使用MATLAB写Arduino串口监视器来控制步进电机
- python - 使用 Python 计算文本文件中的字符串