paulo1205
(usa Ubuntu)
Enviado em 05/05/2017 - 13:10h
rhuangpc escreveu:
Olá amigos, perdão pela demora em responder
--paulo1205
databr="$(date chage -l "$expire" +"%Y%m%d")" <<<------ inserindo o chage -l
hoje="$(date chage -l today +"%Y%m%d")" <<<------ inserindo o chage -l
Mas por que você fez isso?
chage é um comando, e
date é outro. Não vai funcionar se você misturá-los.
Releia minha mensagem. O que eu disse foi que o
chage está devolvendo uma data em Português, e que o comando
date com a opção
-d espera receber uma data em Inglês. E a sugestão que eu dei foi alterar o script de modo que todas as ferramentas trabalhem com datas em Inglês, o que se faz através de uma definição de variável de ambiente (
LC_ALL) no início da execução do script.
Segue uma explicação detalhada do que ocorria.
A data de expiração é obtida por meio de comando
chage com opção
-l, e essa data é salva na variável
expire. Como provavelmente o seu sistema está configurado para trabalhar com idioma Português do Brasil, as rotinas internas do comando
chage acabam seguindo a configuração do sistema na hora de formatar a data. Por isso, o valor colocado na variável
expire fica com um formato em Português (e.g. “
Mai 04, 2017” -- note que está “
Mai” com “i”, não “May” com “y”; aliás, esse formato de mês abreviado antes do dia e com o ano no final e separado por vírgula é uma tradução bem porquinha, porque ninguém escreve datas em Português assim).
Algumas linhas abaixo, o script precisa reformatar a data para um formato que facilite a comparação, a fim de comparar a data de expiração (na variável
datebr, reformatada a partir do valor de
expire) com o dia corrente (variável
hoje). Ele tenta fazer essa reformatação através do comando
date com opção
-d.
O comando
date normalmente trabalha com a data e hora correntes, mas isso pode ser alterado por meio da opção
-d, que permite informar um instante qualquer no tempo, em vez de o momento atual. O problema é que a implementação da opção
-d tem uma gramática fixa, que aparentemente só funciona em Inglês (ou que não foi devidamente traduzida/adaptada para reconhecer Português). Quando o valor de
expire, em Português, é passado ao
date -d, falha a tentativa do programa de reconhecer o momento do tempo a ser considerado, e ele aborta sua execução com uma mensagem de erro (a primeira).
Uma vez que o comando falha, a variável
databr fica com um valor vazio. Esse valor vazio acaba sendo considerado como inexistente pelo comando
[ (sim, o nome do comando é “[”), pois o operador
-ge precisa de dois argumentos, não apenas um. Você acaba chamando o comando como “
[ algum_valor -ge ]”, em lugar de “
[ algum_valor -ge outro_valor ]”, como seria de se esperar. Isso explica a segunda mensagem de erro.
Pouco abaixo, o script tenta reformatar a data de expiração com
date -d uma segunda vez, para imprimi-la no formato “dd/mm/aaaa”, e de novo se esbarra no problema de o valor do argumento estar em Português, causando a terceira mensagem de erro.