Testamos os seguintes comandos com ksh93 printf
em muitos sistemas AIX 5.3/6.1, mas todos falharam com o mesmo resultado.
Por que é que?
#
# oslevel -s
6100-07-09-1341
#
#
# ksh93 -c 'echo ${.sh.version}'
Version M-12/28/93e
#
#
# ksh93 -c 'printf "%T\n" "now"'
ksh93[1]: printf: T: unknown format specifier
#
#
%T
foi adicionado ao kshprintf
em ksh93h lançado em 1999Observe o
h
sufixo (onde você teme
) que indica a versão do ksh93.O último lançamento do ksh93 pela AT&T foi o ksh93u+ lançado em 2012. O desenvolvimento continua como um esforço da comunidade em https://github.com/ksh93/ksh com o último lançamento até o momento sendo ksh93u+m 1.0.6 de junho de 2023 e aquele para o qual você provavelmente desejará mudar, pois vem com centenas de correções de bugs.
Seu ksh93e é antigo, lançado em 1996, ainda mais antigo que o AIX 5.3 ou 6.1 (ambos EOL AFAICT).
Se você tiver sorte, o
date
builtin foi incluído na sua compilação do ksh93 (não sei se era possível no ksh93e, como era antes do ksh93 ser opensource), caso em que você poderia fazer:(com a
date -d
aceitação da mesma especificação de data/horaprintf %T
, não documentada, mas você pode encontrar alguns exemplos nesse arquivo de teste enviado com o ast-open source ) e em vez de:Você faria:
Observe que o bash adicionou a
%T
ao seuprintf
em 4.2 (2011), que implementa um subconjunto da funcionalidade do ksh93 de maneira incompatível.Ele não suporta a análise de datas como
now
o ksh93. Os únicos argumentos suportados são:123456789
#123456789
-1
²now
ou''
-2
O zsh adicionou um
strftime
integrado para formatar datas no 4.1.1 lançado em 2003, que deve ser contemporâneo do AIX 5.3 e pode ser outra opção para você.Para a hora atual em um formato semelhante ao padrão do ksh93
%T
:Os tempos de análise com
strftime -r
(usandostrptime()
) foram adicionados apenas na versão 4.3.3 (2007) (contemporânea ao AIX 6.1).¹ Observe que no bash isso só pode ser um número inteiro enquanto no ksh93 pode ter uma parte decimal (com
.
o caractere de raiz independente da localidade).² desde 5.0, o bash possui uma
$EPOCHSECONDS
variável especial (copiada do zsh) que também pode ser usada lá para o horário atual.³ embora você sempre possa registrar esse tempo no início do seu script com
starttime=${ printf '#%(%s.%N)T' now; }
Para AIX,
printf
o comando%T
não é uma especificação de formato válida. Por favor, verifique o manual . Válidos sãoa, A, d, i, o, u, x, X, f, F, e, E, g, G, c, s, b