Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: Possible ZSH bug with IO direction

Thanks, the workaround did work. But I've never seen read & write redirection at the interactive prompt. Does that make the STDIN for the program I'm running readable and writable? How does that work? Can the program then rewind that descriptor, and write to `input.jpg`?

Also since Bash doesn't suffer from this problem, will this be fixed eventually?

On 24/04/2016 8:14 AM, Bart Schaefer wrote:
On Apr 24,  4:30am, Roger Qiu wrote:
}  > gm convert -compress JPEG - - < input.jpg > output.jpg
} gm convert: Corrupt JPEG data: 873 extraneous bytes before marker 0xd9
} (/tmp/gmo1fx92).

I suspect you are encountering the issue that "gm" wants input.jpg in
binary mode, but zsh's input redirection operator has forced it to text
mode.  A lengthy comment in Src/main.c (copypasted below) explains this.

There's [intended to be] an easy workaround, which is to open the file
for both read and write even though you're only going to read it:

     gm convert -compress JPEG - - <> input.jpg > output.jpg

However, it's been years since I had a Cygwin system or the time/patience
to care to set one up, so I haven't tested the workaround.

Aside:  The zsh/system module "sysopen" doesn't recognize O_BINARY or
O_TEXT modes; that should probably be corrected if someone can compile
on a system that has them, but of course the comment below indicates
that O_BINARY would be overridden anyway.

  * Peter A. Castro <doctor@xxxxxxxxxxxx>
  * Cygwin supports the notion of binary or text mode access to files
  * based on the mount attributes of the filesystem.  If a file is on
  * a binary mounted filesystem, you get exactly what's in the file, CRLF's
  * and all.  If it's on a text mounted filesystem, Cygwin will strip out
  * the CRs.  This presents a problem because zsh code doesn't allow for
  * CRLF's as line terminators.  So, we must force all open files to be
  * in text mode reguardless of the underlying filesystem attributes.
  * However, we only want to do this for reading, not writing as we still
  * want to write files in the mode of the filesystem.  To do this,
  * we have two options: augment all {f}open() calls to have O_TEXT added to
  * the list of file mode options, or have the Cygwin runtime do it for us.
  * I choose the latter. :)
  * Cygwin's runtime provides pre-execution hooks which allow you to set
  * various attributes for the process which effect how the process functions.
  * One of these attributes controls how files are opened.  I've set
  * it up so that all files opened RDONLY will have the O_TEXT option set,
  * thus forcing line termination manipulation.  This seems to solve the
  * problem (at least the Test suite runs clean :).
  * Note: this may not work in later implementations.  This will override
  * all mode options passed into open().  Cygwin (really Windows) doesn't
  * support all that much in options, so for now this is OK, but later on
  * it may not, in which case O_TEXT will have to be added to all opens calls
  * appropriately.

Founder of Matrix AI

Messages sorted by: Reverse Date, Date, Thread, Author