Para um comando, se usar -
como argumento no lugar de um nome de arquivo, significa STDIN ou STDOUT.
Mas neste exemplo, ele cria um arquivo com o nome
-
:echo hello > -
Como posso fazer
-
neste exemplo significar STDOUT?Por outro lado, como posso
-
significar um arquivo nomeado-
em exemplos como:cat -
2>&-
construção, que significa "descritor próximo 2".Respostas:
Usar
-
como nome de arquivo para significar stdin / stdout é uma convenção usada por muitos programas. Não é uma propriedade especial do nome do arquivo. O kernel não reconhece-
como especial, portanto, qualquer chamada do sistema que se refere a-
um nome de arquivo será usada-
literalmente como o nome do arquivo.Com o redirecionamento do bash,
-
não é reconhecido como um nome de arquivo especial; portanto, o bash o usará como o nome do arquivo literal.Quando
cat
vê a string-
como um nome de arquivo, trata-a como sinônimo de stdin. Para contornar isso, você precisa alterar a string quecat
vê de tal maneira que ainda se refere a um arquivo chamado-
. A maneira usual de fazer isso é prefixar o nome do arquivo com um caminho -./-
, ou/home/Tim/-
. Essa técnica também é usada para solucionar problemas semelhantes nos quais as opções de linha de comando se chocam com os nomes de arquivo; portanto, um arquivo chamado./-e
não aparece como a-e
opção de linha de comando de um programa, por exemplo.fonte
/dev/stdin
e/dev/stdout
estão universalmente disponíveis e podem ser usados no lugar da-
convenção.cat
caso, usar o redirecionamento em vez de listar o argumento pode ajudarcat <-
:; no entanto, seria difícil combinar e concatenar isso com a concatenação de mais de um arquivo por vez.jmtd
a pergunta. :)Em vez de
echo hello > -
, você pode usarecho hello > /dev/stdout
.Enquanto '-' é uma convenção que tem de ser implementado por cada programa querer apoiá-lo,
/dev/stdin
,/dev/stdout
e/dev/stderr
são, quando suportado pelo OS (pelo menos Solaris, Linux e BSDs fazer), independente da aplicação e, em seguida, vai funcionar como você pretender.fonte
Como Camh mencionou ,
-
é apenas uma convenção de nomenclatura usada por alguns programas. Se você quiser se referir a esses fluxos com um descritor de arquivo que o shell reconhecerá, o jiliagre estava correto ao usar o nome/dev/stdin
ou/dev/stdout
não. Esses nomes de arquivo devem funcionar em qualquer lugar em que um nome de arquivo normal funcione.Dito isto, seu primeiro exemplo é meio bobo. Qualquer saída que seria capturada pelo operador de redirecionamento para gravar em um arquivo já está ativada na saída padrão; portanto, é inútil redirecioná-lo e gravá-lo de onde veio. O comportamento que você usa nesse canal é o pipe, não um redirecionamento:
No seu segundo exemplo, você simplesmente precisa dar alguma indicação de que deseja um arquivo literário com esse nome, não o apelido interno que ele possui. Você pode fazer isso mais facilmente, especificando um caminho para o arquivo como este:
fonte
Quanto ao 1, o programa precisa apoiá-lo. Você não pode simplesmente usá-lo arbitrariamente. Quanto a 2, redirecione a entrada de (por exemplo,
cat < -
).fonte
A abordagem '-' tem muitos problemas. Antes de tudo, requer uma interpretação do caractere '-' e muitos programas não realizam essa interpretação. Além disso, existem alguns programas que interpretam um hífen como um delimitador, marcando o final das opções da linha de comando. Os programas foram escritos para trabalhar com argumentos de nome de arquivo, a abordagem '-' é um hack, agradável, mas fraca.
A melhor maneira é:
/dev/stdout
é um link simbólico de/dev/fd/1
fonte