mirror of
git://git.code.sf.net/p/cdesktopenv/code
synced 2025-03-09 15:50:02 +00:00
ksh has a little-known field splitting feature that conflicts with POSIX: if a single-byte whitespace character (cf. isspace(3)) is repated in $IFS, then field splitting is done as if that character wasn't a whitespace character. An exmaple with the tab character: $ (IFS=$'\t'; val=$'\tone\t\ttwo\t'; set -- $val; echo $#) 2 $ (IFS=$'\t\t'; val=$'\tone\t\ttwo\t'; set -- $val; echo $#) 4 The latter being the same as, for example $ (IFS=':'; val='1️⃣2️⃣'; set -- $val; echo $#) 4 However, this is incompatible with the POSIX spec and with every other shell except zsh, in which repeating a character in IFS does not have any effect. So the POSIX mode must disable this. src/cmd/ksh93/include/defs.h, src/cmd/ksh93/sh/init.c: - Add sh_invalidate_ifs() function that invalidates the IFS state table by setting the ifsnp discipline struct member to NULL, which will cause the next get_ifs() call to regenerate it. - get_ifs(): Treat a repeated char as S_DELIM even if whitespace, unless --posix is on. src/cmd/ksh93/sh/args.c: - sh_argopts(): Call sh_invalidate_ifs() when enabling or disabling the POSIX option. This is needed to make the change in field splitting behaviour take immediate effect instead of taking effect at the next assignment to IFS. |
||
|---|---|---|
| .. | ||
| argnod.h | ||
| builtins.h | ||
| defs.h | ||
| edit.h | ||
| fault.h | ||
| fcin.h | ||
| history.h | ||
| io.h | ||
| jobs.h | ||
| lexstates.h | ||
| name.h | ||
| national.h | ||
| nval.h | ||
| path.h | ||
| regress.h | ||
| shell.h | ||
| shlex.h | ||
| shnodes.h | ||
| shtable.h | ||
| streval.h | ||
| terminal.h | ||
| test.h | ||
| timeout.h | ||
| ulimit.h | ||
| variables.h | ||
| version.h | ||