Pelo menos no Linux, /dev/stdout
é um link simbólico para /proc/self/fd/1
, que é um link simbólico para o arquivo - então touch /dev/stdout
funciona:
user@host:~$ ( echo hi; stat -c '%y' /tmp/foo >&2; for i in 0 1 2; do sleep 2; touch /dev/stdout; stat -c '%y' /tmp/foo >&2; done ) >> /tmp/foo
2017-11-03 07:02:59.595622835 -0400
2017-11-03 07:03:01.599680859 -0400
2017-11-03 07:03:03.603738883 -0400
2017-11-03 07:03:05.611797023 -0400
No Linux, isso é bem-sucedido ou não faz nada silenciosamente quando stdout não é um arquivo (por exemplo, um canal anônimo, por exemplo, ./myscript.sh | less
, na verdade tem um mtime e o mtime de um soquete é sempre 0). Se o stdout não estiver aberto (o que é possível, embora seja raro), ele produzirá um diagnóstico ("nenhum arquivo ou diretório" na minha máquina). O mesmo se stdout for para um arquivo não gravável.
Não é de todo portátil, mas provavelmente produzirá um diagnóstico e não fará nada (pelo menos como não-raiz, que não deveria poder escrever em /dev
).
Dependendo do seu objetivo real, provavelmente existe uma maneira melhor. Por exemplo, talvez você devesse passar o nome do arquivo para o script, então é trivial usar touch
diretamente nele. Ou se você está fazendo isso para dizer "ainda está vivo!" talvez você queira um arquivo separado para isso (ou use um supervisor de processo e / ou um arquivo pid).