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

相关推荐
冰暮流星13 分钟前
javascript逻辑运算符
开发语言·javascript·ecmascript
flysh0514 分钟前
如何利用 C# 内置的 Action 和 Func 委托
开发语言·c#
码农小韩35 分钟前
基于Linux的C++学习——动态数组容器vector
linux·c语言·开发语言·数据结构·c++·单片机·学习
木风小助理36 分钟前
`mapfile`命令详解:Bash中高效的文本至数组转换工具
开发语言·chrome·bash
yyy(十一月限定版)1 小时前
初始matlab
开发语言·matlab
LawrenceLan1 小时前
Flutter 零基础入门(九):构造函数、命名构造函数与 this 关键字
开发语言·flutter·dart
listhi5201 小时前
基于MATLAB的支持向量机(SVM)医学图像分割方法
开发语言·matlab
hui函数1 小时前
如何解决 pip install 编译报错 g++: command not found(缺少 C++ 编译器)问题
开发语言·c++·pip
Tisfy1 小时前
网站访问耗时优化 - 从数十秒到几百毫秒的“零成本”优化过程
服务器·开发语言·性能优化·php·网站·建站
济6171 小时前
嵌入式C语言(第一期)
c语言·开发语言