【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有用~

相关推荐
-凌凌漆-32 分钟前
【Qt】QStringLiteral 介绍
开发语言·qt
程序员爱钓鱼32 分钟前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
军训猫猫头1 小时前
1.如何对多个控件进行高效的绑定 C#例子 WPF例子
开发语言·算法·c#·.net
真的想上岸啊1 小时前
学习C++、QT---18(C++ 记事本项目的stylesheet)
开发语言·c++·学习
明天好,会的1 小时前
跨平台ZeroMQ:在Rust中使用zmq库的完整指南
开发语言·后端·rust
丁劲犇2 小时前
用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
开发语言·c++·qt·tui·字符界面·curse
旷世奇才李先生2 小时前
Next.js 安装使用教程
开发语言·javascript·ecmascript
charlie1145141913 小时前
深入理解Qt的SetWindowsFlags函数
开发语言·c++·qt·原理分析
likeGhee4 小时前
python缓存装饰器实现方案
开发语言·python·缓存
whoarethenext4 小时前
使用 C++/Faiss 加速海量 MFCC 特征的相似性搜索
开发语言·c++·faiss