date: erro de conversão incorreto no HP-UX, mas não no Linux

2

No Linux:

$ touch 1 12

Não há problema, crie 1 e 12 .

No SysV ou no HP-UX 11.31:

$ touch 1 12
date: bad conversion

Eu tentei com LANG=C , o mesmo erro. Por quê?

    
por elbarna 26.04.2015 / 18:57

2 respostas

2

De acordo com esta página do hp man for touch: link

... o comando espera o seguinte formulário para toque: touch time_str file_name

Esse formulário é reconhecido when neither the -r option, the -t option, nor the -- option delimiter is specified, and the first operand consists of all decimal digits.

    
por 26.04.2015 / 19:47
3

O comando original touch só suportava a configuração da hora de modificação do arquivo para a hora atual.

Os sistemas do Historical System V introduziram a capacidade de especificar uma hora como o primeiro argumento, com a sintaxe [YY]MMDDhhmm (ano, mês, dia, horas, minutos). Naquela época, a convenção para usar um traço e uma letra seguidos de um valor para argumentos opcionais (como -t … ) não estava totalmente estabelecida. Isso criou uma incompatibilidade com versões anteriores, com comandos como o seu - touch 1 12 originalmente significava definir o registro de data e hora em dois arquivos chamados 1 e 12 , mas a partir desse ponto os SysV unices começaram a interpretar 1 (ou qualquer primeiro argumento consistindo inteiramente de dígitos) como timestamp.

Alguns unices modernos, incluindo o HP-UX, optaram por manter a compatibilidade com essas versões do SysV. Outros, incluindo * BSD e versões recentes do GNU, nunca tiveram ou deixaram de oferecer suporte a esta sintaxe.

Versões anteriores do POSIX especificaram touch TIME FILE e touch [-t TIME] FILE , mas como < um POSIX-2001 , somente a sintaxe com a opção -t é suportada.

Para tornar seu script portátil, se for possível que o primeiro argumento de touch seja um arquivo cujo nome consiste inteiramente de dígitos, ou de dígitos e um ponto, coloque -- antes do arquivo (é isso que POSIX recomenda, por isso esperamos que funcione em todos os lugares) ou coloque ./ no início do nome do arquivo:

touch -- 1 12

ou

case "$file" in
  /*) :;;
  *) file="./$file";;
esac
touch "$file"
    
por 26.04.2015 / 23:16

Tags