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/stdin
e/dev/stdout
estã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/stdout
e/dev/stderr
sã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 “.