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"