Eu sei que muitas vezes é possível enganar utilitários de linha de comando que esperam que um arquivo seja canalizado para stdout passando /dev/stdout
como o nome do arquivo.
Eu estou querendo saber se é possível fazer um canal de ferramenta para um descritor de arquivo numerado em vez de stdout
/ stderr
, assim como posso fazer o seguinte para canalizar stderr
em vez de stdout
:
command 2>&1 >/dev/null | grep 'something'
Para tornar minha pergunta mais concreta (exemplo reproduzível mínimo): o que preciso substituir /dev/stdout
aqui para que a saída acabe no descritor de arquivo número 3 em vez de stdout
(não estou fazendo uma pergunta sobre nenhuma ferramenta específica, quero saber o que string para usar para canalizar para fd 3 como posso canalizar para fd 1 usando /dev/stdout
.
cp a /dev/stdout
Substitua cp
por um comando que geralmente espera um caminho de arquivo.
O /dev/3
trabalho? Estou procurando o analógico /dev/stdout
mas para fd 3 em vez de fd 1.
Para reformular a pergunta de outra maneira:
file descriptor 1 is to /dev/stdout
what
file descriptor 3 is to ???
O que devo usar aqui em vez de???
Já pesquisei bastante mas não encontrei nada.
Em vários sistemas (não em todos!),
/dev/fd/
há um diretório de identificadores de arquivo. No Linux normalmente é um link para/proc/self/fd
, mas no NetBSD9 (por exemplo) é um diretório real.Então
No entanto,
cp
parece depender do shell que você usa.No CentOS7 com ksh93...
Isso porque
/dev/fd/9
não é um arquivo normal. Mas combash
...Funcionou!
Podemos ver que isso não é garantido em todas as plataformas e não é portátil, mesmo entre shells na mesma plataforma!
Não em todos os sistemas, tanto quanto eu sei. Mas, no Debian e talvez em todos os Gnu/Linuxes
/dev/stdout
é um link simbólico para/proc/self/fd/1
. Se olharmos no diretório/proc/self/fd/
, encontraremos os outros descritores de arquivo. Observe que apenas os descritores de arquivo que estão em uso estarão aqui. Vai depender do processo.Tentar
/proc/self/fd/«number»
Você pode realmente acessar qualquer arquivo de processo dessa maneira, nomeando o ID do processo.
Isso é específico do sistema operacional e pode não estar disponível para todos os Unixes.