Você pode usar touch
para testar POSIXAMENTE a validade de uma string de data.
Vou usar algumas opções aqui.
-
%código%
- Não crie um arquivo especificado se ele não existir. Não escreva mensagens de diagnóstico sobre essa condição.
-
-c
-
Use o horário especificado em vez do horário atual. O argumento da opção deve ser um número decimal da forma:
[[CC]YY]MMDDhhmm[.SS]
-
Se a hora não puder ser representada como o registro de data e hora do arquivo, -t
deve sair imediatamente com um status de erro.
- Observe que os campos
touch
são opcionais.
E assim, por exemplo:
testtime()
if command -v touch >&2
then touch -c ''
eval ' touch -ct"$1" ""
[ "$?" = '"$? ]"
else { touch; } 2>&3
fi 3>&2 2>/dev/null
É muito cuidadoso lidar com assuntos portáveis, eu acho. Em testes com um GNU e uma herança (Solaris) [[CC]YY]
, a ferramenta GNU retorna 1 para uma data ruim e 0 para uma boa, mas a versão da herança retorna 2 e 1 respectivamente. Tenho quase certeza de que o comportamento da antiga ferramenta Solaris é especificamente referenciado no raciocínio da especificação onde eu encontro:
- Pelo menos uma implementação histórica de
touch
incrementou o código de saída se touch
foi especificado e o arquivo não existia. Este volume de POSIX.1-2008 requer o status de saída zero se nenhum erro ocorrer.
Estou mais convencido quando comparo o comportamento de diferentes versões de minhas ferramentas de herança. O do conjunto de base - que é projetado para se comportar tanto quanto o conjunto original quanto possível e ainda ser útil em sistemas modernos - é o que retorna o 2 e o 1 como mencionado. No entanto, quando eu uso o executável -c
- que é a versão que foi modificada para conformidade com os padrões conforme necessário - ela retorna exatamente como a ferramenta GNU.
Em qualquer caso, a função manipula o Solaris antigo, o Solaris modificado para conformidade e os comportamentos GNU, porque compara os resultados de uma chamada inicial para /usr/heirloom/bin/posix2001/touch
em um operando de arquivo touch
null < em> (que definitivamente não existe) contra uma segunda chamada no mesmo e retorna 0 para uma data boa ou 1 para uma data ruim. Ele retorna 127 e grava para stderr se ''
não puder ser encontrado.
Veja como você pode usá-lo:
testtime MMDD0000 && echo good date || echo bad date
... onde MM e DD são sequências decimais de 2 dígitos representando a data que você deseja testar. Você também pode verificar tempos válidos dessa maneira - e até mesmo com um campo touch
segundos.