faster bash operations on files with File Descriptors.
I was writing a bash script that would do some operations and read and write to file. Seems that that was pretty simple with
1
2 3 4 5 |
and then use redirection operations like “>” and “»” to write to file. Done with the script pretty fast. So far so good, when I went for real life tests, no one was interested in using it, why? Simple, it was simply taking too long. The file was reading about 10K lines and writing about 50 lines and was taking about more than 10 minutes.
So, I sat down to debug what can increase the performance of the script and one change made the difference. The script was taking a lot of time in opening and closing the file. Pretty evident, isn’t it!!!
When using “>” or “»”, each operation would require bash to open the file, write to it and close it. Un-necessarily we would be doing a open and close for each write operation. Pathetic and useless waste of CPU power and time. How to avoid this?
Open a file and get the file descriptor. Keep writing to the file descriptor and close the descriptor after you are done with the file operations.
1
2 3 4 5 |
In the above commands,
1
|
will open the file descriptor FD 3
Note that when you are working with FD, you don’t need “>>” as the echo command will put the statements in the current position of file. So, if you want to append to the file use
1
|
Then you can write to the FD with redirection and finally close the descriptor with
1
|
HTH
Related articles
- Terminating a SSH session after starting background process. (amit-agarwal.co.in)
- OpenAL Tutorial (kcat.strangesoft.net)
- /bin/bash Phone Home (rootshell.be)
Related Articles:
- 2010/08/13 tee to a file descriptor
- 2010/05/10 coproc help - a new feature in bash
- 2011/05/14 Terminating a SSH session after starting background process.
- 2010/11/23 intercept stdout/stderr of another process or disowned process
- 2010/11/20 Broadcast your shell thru port 5000
Authored By Amit Agarwal
Amit Agarwal, Linux and Photography are my hobbies.Creative Commons Attribution 4.0 International License.