Uso do traço (-) no lugar do nome do arquivo

Para um comando, se estiver usando - como um argumento no lugar de um nome de arquivo significará STDIN ou STDOUT.

  1. Mas neste exemplo, ele cria um arquivo com o nome -:

    echo hello > - 

    Como posso fazer - neste exemplo significar STDOUT?

  2. Por outro lado, como posso fazer - significar um arquivo chamado - em exemplos como:

    cat - 

Comentários

  • Já que aparentemente tenho que ter 50 reputação para comentar diretamente .. No comentário / dev / stdin / dev / stdout, o AIX, que é um derivado legítimo do UNIX, não possui esses pseudodispositivos. E, como um comentário adicional, LINUX não é um derivado do UNIX em nenhum caso. É um workalike compatível com POSIX e o mais popular dos sistemas operacionais UNIX-ish ‘ s neste ponto, mas não se engane, isso não é UNIX. Mas, a essência das respostas aqui está correta. A notação ” – ” não é interpretada como especial pelo shell e, portanto, é passada diretamente para cada aplicativo individual como um ARG. Se o aplicativo não reconhece
  • Também há 2>&- construção, o que significa ” fechar descritor 2 “.
  • @ user95873, o que suponho que você queria dizer é: embora o Linux seja semelhante ao Unix, nem todo semelhante ao Unix (ou UNIX verdadeiro) é Linux . A questão se o Linux é ou não ‘ t UNIX verdadeiro (ou seja, está em conformidade com a Especificação Única do UNIX) não ‘ tem relação com / dev / problema de {entrada, saída, erro} std. Como / dev / std {in, out, err} é um recurso adicionado , não ausente .

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

  1. Em vez de echo hello > -, você pode usar echo 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.

  1. 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 | 
  2. 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.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *