Uso de dash (-) no lugar de um nome de arquivo

74

Para um comando, se usar - 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 com que - neste exemplo signifique STDOUT?

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

    cat -
    
por Tim 10.07.2011 / 00:14

5 respostas

118

Usar - como um nome de arquivo significa que stdin / stdout é uma convenção que muitos programas usam. Não é uma propriedade especial do nome do arquivo. O kernel não reconhece - como especial, então qualquer chamada de sistema referente a - como um 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 usará isso 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 que cat vê de tal forma que ela 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 em que as opções de linha de comando entram em conflito com nomes de arquivos, portanto, um arquivo chamado ./-e não aparece como a opção de linha de comando -e em um programa, por exemplo.

    
por 10.07.2011 / 01:25
15
  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 queira suportá-lo, /dev/stdin , /dev/stdout e /dev/stderr são, quando suportados pelo SO (pelo menos Solaris, Linux e BSDs fazem ), independente da aplicação e, em seguida, funcionará como você pretende.

por 10.07.2011 / 04:26
5

Quanto a 1, o programa deve apoiá-lo. Você não pode simplesmente usá-lo arbitrariamente. Quanto a 2, redireciona a entrada de (por exemplo, cat < - ).

    
por 10.07.2011 / 00:22
0

A abordagem '-' tem muitos problemas. Em primeiro lugar, requer uma interpretação do caractere '-' e muitos programas não realizam essa interpretação. E, 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 truque legal, mas fraco.

A melhor maneira é:

$ echo hello > /dev/fd/1

/dev/stdout é um link simbólico de /dev/fd/1

    
por 03.10.2016 / 20:26