File Descriptors in Bash

2024-06-06

What Are File Descriptors?

Simply put, file descriptors are numbers that your shell uses to keep track of open files. When you run a command, it typically has the following file descriptors open:

  • 0 (stdin): Usually connected to your keyboard.
  • 1 (stdout): Usually connected to your terminal.
  • 2 (stderr): Usually connected to your terminal.

The exec Command: Your File Descriptor Toolbox

The exec command is your key to manipulating file descriptors. Here’s how you can use it:

#1 Open a file for reading:

exec 7< myfile.txt

#2 Open a file for writing:

exec 7> myfile.txt

#3 Open a file for reading and writing:

exec 7<> myfile.txt

#4 Close a file descriptor:

exec 7>&-

#5 Duplicate a file descriptor (duplicates stdout to file descriptor 7):

exec 7>&1 

Example: Redirecting Output to a Specific File Descriptor

Open logfile.txt for writing on file descriptor 7 and then Send output to file descriptor 7.

Open logfile.txt for writing on file descriptor 7 and then Send output to file descriptor 7.

Listing Open Files with lsof

The lsof command (list open files) lets you peek into your shell’s open files.

lsof -p $$  # List files open by your current shell (whose PID is stored in $$)

Real-World Applications

File descriptors are indispensable for scripting. For example, you can:

  • Log errors to a separate file while sending normal output to the terminal.
  • Open and manipulate multiple files within a script.
  • Create complex pipelines for data processing.

Conclusion

We’ve only scratched the surface of file descriptors and their potential. There’s a whole world of advanced techniques waiting to be explored. But with this foundation, you’re well on your way to becoming a Bash redirection master!