No linux, você pode fazer isso com:
stdin_is_dev_null(){ test "'stat -Lc %t:%T /dev/stdin'" = "'stat -Lc %t:%T /dev/null'"; }
Em um linux sem stat (1) (por exemplo, o busybox no seu roteador):
stdin_is_dev_null(){ ls -Ll /proc/self/fd/0 | grep -q ' 1, *3 '; }
Em * bsd:
stdin_is_dev_null(){ test "'stat -f %Z'" = "'stat -Lf %Z /dev/null'"; }
Em sistemas como * bsd e solaris, /dev/stdin
, /dev/fd/0
e /proc/PID/fd/0
não são links simbólicos "mágicos" como no linux, mas dispositivos de caracteres que mudam para o arquivo real quando abertos . Um stat (2) em seu caminho retornará algo diferente de um fstat (2) no descritor de arquivo aberto.
Isso significa que o exemplo do linux não funcionará lá, mesmo com o GNU Coreutils instalado. Se as versões do GNU stat (1) forem recentes o suficiente, você pode usar o argumento -
para permitir que ele faça um fstat (2) no descritor de arquivo 0, assim como o stat (1) de * bsd:
stdin_is_dev_null(){ test "'stat -Lc %t:%T -'" = "'stat -Lc %t:%T /dev/null'"; }
Também é muito fácil fazer o teste portably em qualquer idioma que ofereça uma interface para o fstat (2), por exemplo. em perl
:
stdin_is_dev_null(){ perl -e 'exit((stat STDIN)[6]!=(stat "/dev/null")[6])'; }