O ponto inteiro de stdin
é que pode ser qualquer coisa, pode ser, por exemplo, um pipe, um soquete de rede, um arquivo regular, um dispositivo, pode estar no meio de um arquivo regular quando seu script é iniciado. .. Se você não pode processar os dados em uma passagem, então você se limita a arquivos procuráveis , que são arquivos regulares e alguns arquivos de dispositivos, ou terá que armazenar as informações de alguma forma (em um arquivo temporário ou memória ...). É possível aqui obter todas as informações de uma só vez.
Por exemplo, você poderia fazer:
$ grep -o '[<>]' < a.html | sort | uniq -c
82 <
82 >
POSIXly:
fold -w 1 a.html | grep '[<>]' | sort | uniq -c
Para detectar incompatibilidade:
if fold -w 1 a.html | awk '{n[$0]++}
END{exit(n["<"]!=n[">"])}'
then
echo match
else
echo mismatch
fi
Agora, para responder a pergunta no assunto, no Linux, você pode encontrar um "nome" para stdin com:
readlink -f /dev/stdin
Exemplo:
$ readlink -f /dev/stdin < a
/home/chazelas/a
$ : | readlink -f /dev/stdin
/proc/20238/fd/pipe:[758683]
(20238 acima é o pid de readlink
, então esse caminho não será de muita utilidade após readlink
ter saído, e não seria assim, que pipe:[758683]
é apenas informativo, pode ' t ser aberto ).
E, mais geralmente, se lsof
estiver disponível:
lsof -ad0 -p "$$" -Fn 2> /dev/null | sed -n 'n;s/^n//p'
(Embora, $$
seja o pid do processo que executou o shell, ele não funcionaria em subshells que tiveram seu stdin redirecionado)
Agora, você não será necessariamente capaz de reabrir esse arquivo para leitura, e mesmo quando o fizer, a leitura desse arquivo pode não fornecer os mesmos dados novamente (pense em pipes, por exemplo).
$ seq 3 > a
$ { cat; cat /dev/stdin; } < a
1
2
3
1
2
3
$ cat a | { cat; cat /dev/stdin; }
1
2
3
No Linux, abrir /dev/stdin
se stdin for um arquivo regular, lerá o arquivo do início novamente enquanto em outros sistemas, abrir / dev / stdin for mais parecido com um dup(0)
, ou seja, ele não retrocederá arquivo para o início (no primeiro exemplo acima, ele produziria 1\n2\n3\n
uma vez em vez de duas vezes).