I just came across the following script while browsing this question:
rm -f out
mkfifo out
trap "rm -f out" EXIT
while true
do
cat out | nc -l 1500 > >( # parse the netcat output, to build the answer redirected to the pipe "out".
export REQUEST=
while read line
do
line=$(echo "$line" | tr -d '[\r\n]')
if echo "$line" | grep -qE '^GET /' # if line starts with "GET /"
then
REQUEST=$(echo "$line" | cut -d ' ' -f2) # extract the request
elif [ "x$line" = x ] # empty line / end of request
then
HTTP_200="HTTP/1.1 200 OK"
HTTP_LOCATION="Location:"
HTTP_404="HTTP/1.1 404 Not Found"
# call a script here
# Note: REQUEST is exported, so the script can parse it (to answer 200/403/404 status code + content)
if echo $REQUEST | grep -qE '^/echo/'
then
printf "%s\n%s %s\n\n%s\n" "$HTTP_200" "$HTTP_LOCATION" $REQUEST ${REQUEST#"/echo/"} > out
elif echo $REQUEST | grep -qE '^/date'
then
date > out
elif echo $REQUEST | grep -qE '^/stats'
then
vmstat -S M > out
elif echo $REQUEST | grep -qE '^/net'
then
ifconfig > out
else
printf "%s\n%s %s\n\n%s\n" "$HTTP_404" "$HTTP_LOCATION" $REQUEST "Resource $REQUEST NOT FOUND!" > out
fi
fi
done
)
done
Yet, I am still struggling to "decode" the syntax found in the 6th line, namely: > >
On one hand I would expect that there was not any blank space in-between >
characters - as soon as I remove that blank space the script simply does not run anymore.
On the other hand I would not expect to find a redirection being sent to another process since in those cases a simple pipe would be the perfect fit. Actually, I replaced > >
by |
and the script ran smoothly.
Long story short, could you explain to me:
- Why is the blank space in-between > mandatory ?
- Which is the semantics of the command > > ? (A redirection I guess !)
- Why not to use a pipe instead of a redirection ?
Thank you in advance.