Awk detecta stdin

0

Perl, Ruby e PHP podem detectar stdin:

$ perl -e 'print -t ? "no stdin" : "stdin"'
no stdin

$ echo | perl -e 'print -t ? "no stdin" : "stdin"'
stdin

$ ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
no stdin

$ echo | ruby -e 'puts $stdin.isatty ? "no stdin" : "stdin"'
stdin

$ php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
no stdin

$ echo | php -r 'print posix_isatty(STDIN) ? "no stdin" : "stdin";'
stdin

O Awk tem alguma maneira de fazer isso? Eu tentei o ARGC, mas é o mesmo em ambos os casos:

$ awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin

$ echo | awk 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}'
no stdin
    
por Steven Penny 31.03.2018 / 16:22

2 respostas

3

Seus exemplos de perl, ruby e php testam se existe stdin. Sua abordagem do awk apenas testa se o stdin deve ser usado.

Você pode usar system("tty") no awk para fazer isso.

    
por 31.03.2018 / 16:48
1

ARGC is the number of command-line arguments present. (indexed from 1)

Em ambos os casos mencionados, o comando awk / expression 'BEGIN {print ARGC == 1 ? "no stdin" : "stdin"}' é considerado como o primeiro argumento, independentemente de quaisquer dados serem canalizados para o comando atual.

Para verificar o nome do arquivo do terminal conectado à entrada padrão:

echo "a" | awk 'BEGIN { "tty" | getline r;  print r == "not a tty"? "stdin" : "no stdin" }'
stdin

awk 'BEGIN { "tty" | getline r;  print r == "not a tty"? "stdin" : "no stdin" }'
no stdin
    
por 31.03.2018 / 16:46