1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Revert <> redir FD except in posix mode (re: eeee77ed, 60516872)

eeee77ed implemented a POSIX compliance fix that caused a potential
incompatibility with existing ksh scripts; it made the (rarely
used) read/write redirection operator, <>, default to file
descriptor 0 (standard input) as POSIX specified, instead of 1
(standard output) which is traditional ksh93 behaviour. So ksh
scripts needed to change all <> to 1<> to override the new default.

This commit reverts that change, except in the new posix mode.

src/cmd/ksh93/sh/lex.c:
- Make FD for <> default to 0 in POSIX mode, 1 otherwise.

src/cmd/ksh93/tests/io.sh:
- Revert <> regression test changes from 60516872; we no longer
  need 1<> instead of <> in ksh code.
This commit is contained in:
Martijn Dekker 2020-09-01 08:36:28 +01:00
parent fd977388a2
commit c607c48c84
4 changed files with 10 additions and 5 deletions

3
NEWS
View file

@ -17,6 +17,9 @@ Any uppercase BUG_* names are modernish shell bug IDs.
* causes the 'let' arithmetic command to recognise octal numbers by * causes the 'let' arithmetic command to recognise octal numbers by
leading zeros regardless of the setting of the 'letoctal' option leading zeros regardless of the setting of the 'letoctal' option
* causes file descriptors > 2 to be left open when invoking another program * causes file descriptors > 2 to be left open when invoking another program
* makes the <> redirection operator default to stdin instead of stdout
(this keeps the 2020-05-13 BUG_REDIRIO fix for the POSIX mode while
restoring traditional ksh93 behaviour for backwards compatibility)
2020-08-19: 2020-08-19:

View file

@ -3423,7 +3423,8 @@ otherwise, the file is created.
Open file Open file
.I word\^ .I word\^
for reading and writing for reading and writing
as standard input. as standard output.
If the \fBposix\fR option is active, it defaults to standard input instead.
.TP .TP
.BI <>; word .BI <>; word
The same as The same as
@ -7040,6 +7041,7 @@ to fail or zero if no command has failed.
Enable POSIX standard compatibility mode. This option Enable POSIX standard compatibility mode. This option
is on by default if ksh is invoked as \fBsh\fR. It is on by default if ksh is invoked as \fBsh\fR. It
causes file descriptors > 2 to be left open when invoking another program, causes file descriptors > 2 to be left open when invoking another program,
makes the \fB<>\fR redirection operator default to standard input,
enables octal numbers in \fBlet\fR shell arithmetic (see \fBletoctal\fR), and enables octal numbers in \fBlet\fR shell arithmetic (see \fBletoctal\fR), and
disables the \fB&>\fR redirection shorthand. disables the \fB&>\fR redirection shorthand.
.TP 8 .TP 8

View file

@ -601,7 +601,7 @@ int sh_lex(Lex_t* lp)
c |= SYMPIPE; c |= SYMPIPE;
else if(c=='<' && n=='>') else if(c=='<' && n=='>')
{ {
lp->digits = 0; lp->digits = sh_isoption(SH_POSIX) ? 0 : 1;
c = IORDWRSYM; c = IORDWRSYM;
fcgetc(n); fcgetc(n);
if(fcgetc(n)==';') if(fcgetc(n)==';')

View file

@ -304,14 +304,14 @@ fi
$SHELL -c 'exec 3<>; /dev/null' 2> /dev/null && err_exit '<>; with exec should be an error' $SHELL -c 'exec 3<>; /dev/null' 2> /dev/null && err_exit '<>; with exec should be an error'
$SHELL -c ': 3<>; /dev/null' 2> /dev/null || err_exit '<>; not working with at all' $SHELL -c ': 3<>; /dev/null' 2> /dev/null || err_exit '<>; not working with at all'
print $'hello\nworld' > $tmp/1 print $'hello\nworld' > $tmp/1
if ! $SHELL -c "false 1<>; $tmp/1" 2> /dev/null if ! $SHELL -c "false <>; $tmp/1" 2> /dev/null
then [[ $(<$tmp/1) == $'hello\nworld' ]] || err_exit '<>; not preserving file on failure' then [[ $(<$tmp/1) == $'hello\nworld' ]] || err_exit '<>; not preserving file on failure'
fi fi
if ! $SHELL -c "head -1 $tmp/1" 1<>; $tmp/1 2> /dev/null if ! $SHELL -c "head -1 $tmp/1" <>; $tmp/1 2> /dev/null
then [[ $(<$tmp/1) == hello ]] || err_exit '<>; not truncating file on success of head' then [[ $(<$tmp/1) == hello ]] || err_exit '<>; not truncating file on success of head'
fi fi
print $'hello\nworld' > $tmp/1 print $'hello\nworld' > $tmp/1
if ! $SHELL -c head < $tmp/1 <#((6)) 1<>; $tmp/1 2> /dev/null if ! $SHELL -c head < $tmp/1 <#((6)) <>; $tmp/1 2> /dev/null
then [[ $(<$tmp/1) == world ]] || err_exit '<>; not truncating file on success of behead' then [[ $(<$tmp/1) == world ]] || err_exit '<>; not truncating file on success of behead'
fi fi