Para um comando, se estiver usando - como um argumento no lugar de um nome de arquivo significará 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 fazer
-significar um arquivo chamado-em exemplos como:cat -
Comentários
Resposta
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 de sistema que se refira a - como nome de arquivo usará - literalmente como o nome do arquivo.
Com o redirecionamento bash, - não é reconhecido como um nome de arquivo especial, então o bash o usará como nome de arquivo literal.
Quando cat vê a string - como um nome de arquivo, ele o trata como um sinônimo de stdin. Para contornar isso, você precisa alterar a string que cat vê de forma que ainda se refira 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 contornar problemas semelhantes em que as opções de linha de comando entram em conflito com nomes de arquivos, de modo que um arquivo referido como ./-e não aparece como -e opção de linha de comando para um programa, por exemplo.
Comentários
- It ‘ s vale a pena acrescentar que
/dev/stdine/dev/stdoutestão universalmente disponíveis e podem ser usados no lugar do-convenção. - @jmtd: / dev / std {in, out} não estão universalmente disponíveis. Nem todos os unixes têm.
- Interessante, presumi que eles faziam parte do POSIX (mas não podem ‘ confirmar). Eles ‘ estão presentes pelo menos no Linux, BSDs e Solaris. Você pode dar um exemplo de um UNIX moderno que não os possui?
- @camh Não tenho certeza se você recebeu a notificação, e este é um tópico muito, muito antigo; Eu ‘ não tenho certeza se você pode, mas ‘ estou muito curioso se você sabe a resposta para
jmtd‘ s pergunta? 🙂 - @jmtd Parece que encontrei uma resposta provisória para a pergunta: unix.stackexchange.com/a/278368/31669
Resposta
-
Em vez de
echo hello > -, você pode usarecho hello > /dev/stdout.Embora “-” seja uma convenção que deve ser implementada por cada programa que deseja oferecer suporte,
/dev/stdin,/dev/stdoute/dev/stderrsão, quando suportados pelo sistema operacional (pelo menos Solaris, Linux e BSDs têm) , independente do aplicativo e, em seguida, funcionará como você deseja.
Resposta
Como camh mencionado , - é 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á, jiliagre estava correto ao usar o nome /dev/stdin ou /dev/stdout em vez disso. Esses nomes de arquivo devem funcionar em qualquer lugar em que um nome de arquivo normal funcione.
-
Dito isso, seu primeiro exemplo é meio bobo. Qualquer saída que seria capturada pelo operador de redirecionamento para gravar em um arquivo já é a saída padrão ON, portanto, redirecioná-la e gravá-la de volta de onde veio é inútil. O comportamento que você usa lá é o pipe, não um redirecionamento:
echo hello | -
Em seu segundo exemplo, você simplesmente precisa fornecer algum indicação de que você deseja um arquivo literal com esse nome, não o alias interno que ele possui. Você pode fazer isso mais facilmente especificando um caminho para o arquivo como este:
cat ./-
Resposta
Quanto ao 1, o programa deve suportá-lo. Você não pode usá-lo arbitrariamente. Quanto a 2, redirecione a entrada de (por exemplo, cat < -).
Resposta
A abordagem “-” tem muitos problemas. Em primeiro lugar, requer uma interpretação do caractere “-” e muitos programas não realizam tal interpretação. Além disso, existem alguns programas que interpretam um hífen como um delimitador que marca o fim das opções de linha de comando. Os programas são escritos para trabalhar com argumentos de nome de arquivo, a abordagem “-” é um hack, boa, mas fraca.
A melhor maneira é:
$ echo hello > /dev/fd/1
/dev/stdout é um link simbólico de /dev/fd/1
Comentários
- O redirecionamento é interpretado pelo shell, não pelo programa que está sendo chamado.
Resposta
Os caracteres especiais têm principalmente dois significados:
Gráfico numérico ASCII.
Script ou simbólico.
É possível que um único caractere represente uma string, ou atue como uma string. Conforme meu entendimento.
na linguagem C fopen() a função leva dois argumentos primeiro fluxo de arquivo e o segundo modo no qual o arquivo será aberto. o modo é uma string. mesmo se for “um único caractere.
cat > ” – ” funciona.
2>&-construção, o que significa ” fechar descritor 2 “.