Misc infos
Bash handles several filenames specially when they are used in redirections, as described in the following table:
/dev/fd/fd
If fd is a valid integer, file descriptor fd is duplicated.
/dev/stdin
File descriptor 0 is duplicated.
/dev/stdout
File descriptor 1 is duplicated.
/dev/stderr
File descriptor 2 is duplicated.
Playing with several file descriptors
Here is a small example of a shell script using several file descriptors. This script reads a file with the following columns “ip_address trafic_in trafic_out”, and writes two files trafic_in and trafic_out.
#!/bin/bash
# open the two output files
exec 6>/tmp/trafic_in.dat
exec 7>/tmp/trafic_out.dat
#open the file containing the data for input.
exec 8</tmp/all_trafic.dat
# data processing
grep -v '^#' <&8 | while read line
do
set - $(echo $line)
echo "${1} ${2}" >&6
echo "${1} ${3}" >&7
done
#close the file descriptors
exec 6<&-
exec 7<&-
Playing with stdin
exec < /path/to/textfile
while read line; do
echo $line
[... whatever ...]
done
Playing with Network-Sockets
/dev/tcp/host/port
If host is a valid hostname or Internet
address, and port is an integer port number
or service name, bash attempts to open a TCP
connection to the corresponding socket.
/dev/udp/host/port
If host is a valid hostname or Internet
address, and port is an integer port number
or service name, bash attempts to open a UDP
connection to the corresponding socket.
well actually you’ll not going to find directories named /dev/tcp and /dev/udp (unless you create them, but don’t).they are valid only in bash.let’s suppose that you have port 80 (www) open. we could improvise a simple web browser in bash by opening a tcp connection like this:
$ exec 3<> /dev/tcp/127.0.0.1/80
now descriptor 3 points to port 80 of our machine (if you’re connected to the Internet you can open sockets to remote hosts by simply providing their hostname/address and port) lets send the http request:
$ echo "GET /index.html HTTP/1.0" 1>&3
$ echo 1>&3
now the result is waiting for us to get it:
$ while read 0<&3; do echo $REPLY; done
this reads up a line until EOF and prints it on screen
now I suppose you know what `network programming in bash’ is. but if you’re new to it I recommend you to read the manual page first then guides like this.
Network programming in bash is cool. Now write something useful!