Isso não é POSIX porque você não pode usá-lo em scripts POSIX porque POSIX deixa o comportamento não especificado . Isso significa que, embora um aplicativo (um script) não possa usá-lo se quiser ser portátil, uma implementação (uma awk
implementation) pode fazer o que quiser, se você fizer e ainda for POSIX. POSIX não requer awk
para dividir em caracteres ou bytes, ou relatar um erro, ou reiniciar o computador, ele não é especificado.
Portanto, gawk
não tem motivos para alterar seu comportamento a esse respeito quando $POSIXLY_CORRECT
está no ambiente¹, não há comportamento que seja mais POSIXmente correto do que o outro nessa instância.
Como você descobriu, essa extensão é encontrada no gawk (desde 3.0, janeiro de 1996) e no mawk (desde a versão 1.2, janeiro de 1996). Também está em busybox awk
(desde o início (2002)), e desde maio de 1996 também no mantido por Brian Kernighan (o k
em awk
) (o arquivo FIXES
se refere a gawk
, etc. como inspiração). Parece que foi adicionado a todos os 3 dentro de alguns meses, sugerindo que talvez tenha sido discutido entre os seus mantenedores. Não tenho mais certeza agora de quem teve a ideia primeiro.
Com awk
de Brian Kernighan ou os baseados nele como no FreeBSD ou OpenBSD, note que enquanto um FS
vazio ou um terceiro argumento vazio passado para split()
faz com que a string seja dividida em seus caracteres individuais ( bem, bytes , veja abaixo), awk -F ''
retorna um erro ( awk -v FS=
está OK embora).
No Solaris, com nawk
e /usr/xpg4/bin/awk
(e também o antigo /bin/awk
dos anos 70), um FS
vazio parece desabilitar totalmente a divisão. nawk -F ''
retorna um erro. Eu esperaria que fosse o mesmo em outros Unices comerciais baseados em código AT & A, como AIX ou HP / UX, embora eu não possa testá-lo lá.
Observe também que mawk
, awk
do bwk (isso é diferente para alguns baseados nele) e o busybox awk não suportam caracteres multibyte. Então, por exemplo, em UTF-8:
echo Stéphane | awk -v FS= '{print $4}'
imprimiria a segunda metade do terceiro caractere em meu primeiro nome. Então, com esses, é mais correto dizer que um FS vazio se divide em bytes individuais, não em caracteres.
¹ Agora percebo que com POSIXLY_CORRECT, ou --posix
, gawk
desabilita algumas extensões que não entram em conflito com POSIX ( typeof
torna gawk
não-compatível), então você pode dizer que é uma omissão. Agora não seria o primeiro. Por exemplo, ele não desativa nextfile
, mesmo que esteja em conflito com POSIX ( awk '{nextfile = 1}'
tem como objetivo atribuir 1 à variável nextfile
, mas relata um erro em gawk
, mesmo em POSIXLY_CORRECT).