【shell编程】报错信息:bash: bad file descriptor(包含6种解决方法)

大家好,我是摇光~

在运行 Shell 脚本时,遇到 bash: bad file descriptor 错误通常意味着脚本尝试对一个无效或不可用的文件描述符(file descriptor)执行了读写操作。

以下是一些可能导致这个问题的原因、详细案例以及相应的解决方案:


首先我们来了解一下:文件描述符,这里用一些简单易理解的解释下这个名词。

  • 在Linux操作系统中,文件描述符(File Descriptor,简称FD)就像是一个"门牌号",它用来标识和访问被打开的文件或其他输入/输出资源(比如管道、套接字等)。
  • 每个打开的文件或资源都会有一个唯一的文件描述符与之对应。

想象一下,你有很多房间(文件或资源),每个房间都有一个独特的门牌号(文件描述符)。当你想要进入某个房间(访问某个文件或资源)时,你只需要告诉系统你想要去的门牌号(文件描述符),系统就会帮你打开那扇门(访问那个文件或资源)。

我用shell脚本来举个关于文件描述符的例子:

bash 复制代码
# 打开一个文件用于写入,并将文件描述符3与之关联
exec 3>output.txt

# 向文件描述符3(即output.txt文件)写入内容
echo "This is a test message written to file descriptor 3." >&3

# 关闭文件描述符3
exec 3>&-

上面的就是文件描述符的一些知识点。


下面我们来看一下出现"bash: bad file descriptor"错误的原因:

1. 重复关闭文件描述符

  • 案例:
bash 复制代码
exec 3>output.txt  # 打开文件描述符3用于写入output.txt
exec 3>&-         # 关闭文件描述符3
exec 3>&-         # 尝试再次关闭已关闭的文件描述符3
  • 解决方案:
  • 确保每个文件描述符只被关闭一次,上述例子可以删除一个exec 3>&-
  • 可以通过检查脚本中的 exec 命令来避免重复关闭,搜索一下 exec 命令是否存在重复关闭。

2. 使用已关闭的文件描述符

  • 案例:
bash 复制代码
exec 3>output.txt  # 打开文件描述符3
exec 3>&-         # 关闭文件描述符3
echo "Hello" >&3  # 尝试向已关闭的文件描述符3写入数据
  • 解决方案:
  • 在文件描述符关闭后,不要尝试对其进行任何操作。
  • 所以上面代码 echo "Hello" >&3 应该写在第二行,最后才进行关闭exec 3>&-

3. 文件描述符溢出

  • 案例:

虽然 Bash 通常允许打开大量文件描述符(受限于系统配置)

但如果你打开了非常多而没有关闭,可能会耗尽可用的文件描述符。

  • 解决方案:
  • 使用 ulimit -n 查看当前 shell 会话的文件描述符限制。
  • 在脚本中适当关闭不再需要的文件描述符。
  • 考虑使用文件描述符的循环重用,特别是当处理大量文件时。

4. 错误的文件描述符传递或使用

  • 案例:
bash 复制代码
exec 3>output.txt  # 打开文件描述符3
# 错误地将文件描述符3作为参数传递给不期望它的命令
some_command -f 3
  • 解决方案:
  • some_command 这个命令是有问题的,不能操作文件,所以就是错误的命令。
  • 确保将正确的文件描述符传递给需要它的命令。

5. 子 Shell 中的文件描述符问题

  • 案例:
bash 复制代码
(
  exec 3>output.txt  # 在子 shell 中打开文件描述符3
)
echo "Hello" >&3    # 在父 shell 中尝试向子 shell 的文件描述符3写入数据
  • 解决方案:
  • 在正确的 shell 上下文中管理文件描述符。
  • 如果需要在多个 shell 环境中共享文件描述符,考虑使用命名管道(FIFO)或其他进程间通信机制。

6. 使用了不正确的重定向语法

  • 案例:
bash 复制代码
echo "Hello" >3      # 缺少 `&` 来指定文件描述符
  • 解决方案:

使用正确的重定向语法。

  • 对于文件描述符,确保在数字前加上 & 符号,如 >&3 或 <&3。

有些错误属于一些基础知识,如果想学习一些Linux基础知识可以转自:Linux零基础快速入门(非常详细),全覆盖Linux的基础知识,写得比较全。

以上就是shell脚本运行出现"bash: bad file descriptor"错误的一些原因和解决方法。

希望对你找出bug有用~

相关推荐
kolyle2 小时前
万级 QPS 下的 Token 分发系统架构:从 0 到 1 跑通 AI 时代的“水电煤“
开发语言·人工智能·系统架构·token·qps·极智词元·大模型私有化部署
caoerzhong2 小时前
JeeWMS 开源仓库管理系统 GPL-3.0 合规指南:Java WMS 二次开发前必须弄清的授权边界
java·开发语言·开源·vue
Patrick在香港2 小时前
Python 审计香港开放数据目录:两个端点差 10 倍,只有 9.3% 的资源标了「最后修改时间」
开发语言·数据库·python·数据分析·api·数据治理·开放数据
Sylvia33.3 小时前
火星数据体育API|一站式接入足球篮球电竞等18+项目实时数据
java·开发语言·python·websocket·游戏
Data_Journal3 小时前
使用 AutoScraper 进行网页抓取:分步教程
大数据·开发语言·数据库·python·scrapy
yume_sibai4 小时前
12-Rust 性能优化指南(性能分析 + 内存优化 + SIMD + 并发优化 + 编译器优化 + 基准测试)
开发语言·性能优化·rust
萧瑟余晖4 小时前
Hibernate 核心原理与架构详解
开发语言·架构·hibernate
爱喝水的鱼丶4 小时前
SAP-ABAP:SAP MM 模块物料主数据批量导入与增强开发:字段扩展、校验逻辑与批量导入工具开发
开发语言·性能优化·sap·abap·增强·经验交流·mm
geovindu4 小时前
rust:Builder Pattern
开发语言·设计模式·rust·建造者模式
白远山4 小时前
健身场馆无人自动化解决方案:从架构到落地实践
java·开发语言·数据库·数据挖掘·需求分析