Home > Software engineering >  Behaviour of /dev/stdout in Cygwin
Behaviour of /dev/stdout in Cygwin

Time:08-16

I have a script (executed with zsh 5.8; but this should not be relevant in this case) in a Cygwin environment, which takes as parameter the name of some output file and writes to this files via redirection in various places, like this:

outfile=$1
: >$outfile # Ensure that the file exists and is empty.
.... do some work
command_x >>$outfile
.... do more work
command_y >>$outfile
... and so on

I would like to modify the behviour of the script in that if no parameter is supplied, the output of the commands goes to standard output instead. I thought that it would be sufficient to modify the script in one line:

outfile=${1:-/dev/stdout}

But nothing is written to stdout. Investigating the case further, I found that instead a regular file named stdout had been created in the /dev directory. It seems that in the Cygwin environment, /dev/stdout does not represent the standard output of the process.

How would I achieve my goal under Cygwin?

UPDATE

As requested by @matzeri, here is a simple testcase:

echo x >/dev/stdout

Expected behaviour: Seeing x on stdout

Real behaviour: A regular file /dev/stdout has been created

CodePudding user response:

on a standard windows installation the /dev/std* are a symlink to the /proc/self/fd/*

ls -l /dev/std*
lrwxrwxrwx 1 Marco Kein 15 Jun 19  2018 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 Marco Kein 15 Jun 19  2018 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 Marco Kein 15 Jun 19  2018 /dev/stdout -> /proc/self/fd/1

if for any reason that is not anymore true they can be recreated by /etc/postinstall/bash.sh.done script

$ grep self /etc/postinstall/bash.sh.done
/bin/test -h /dev/stdin  || ln -sf /proc/self/fd/0 /dev/stdin  || result=1
/bin/test -h /dev/stdout || ln -sf /proc/self/fd/1 /dev/stdout || result=1
/bin/test -h /dev/stderr || ln -sf /proc/self/fd/2 /dev/stderr || result=1
/bin/test -h /dev/fd     || ln -sf /proc/self/fd   /dev/fd     || result=1

In that condition the command

$ echo x > /dev/stdout
x

produces the expected output on both Bash and Zsh

  • Related