O que o hífen "-" significa em "tar xzf -"?

23

Ao tentar instalar o dropbox a partir da linha de comando, li os comandos

cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -

o que -significa aqui? é o diretório anterior?

Álgebra
fonte
9
Um pouco de pediatria: a opção que você está perguntando é f -. Isso pode facilitar a localização das respostas nas páginas de manual.
studog 18/06
4
Seria realmente útil se você pudesse explicar o que, precisamente , não está claro para você sobre a documentação de wgete tar. Dessa forma, os respectivos desenvolvedores podem melhorar sua documentação para que os usuários futuros não tropeçam nos mesmos problemas novamente. Em outras palavras: seja um herói e faça do mundo um lugar melhor!
Jörg W Mittag
2
Seria um bom padrão para o tar usar stdin, mas como é tradição trabalhar com fitas, ele não fez isso. Em vez disso, aprendeu a trabalhar com arquivos (com a opção f) e segue a convenção para ter um - no lugar do nome do arquivo para stdin (no caso do eXtract ou stdout no caso do Create)
eckes
1
@eckes No caso do GNU tar, stdin é o padrão, a menos que $TAPEesteja definido.
chrylis -on strike -

Respostas:

42

Alguns comandos aceitam -no lugar de um nome de arquivo:

  • Para gravar na saída padrão em vez de em um arquivo nomeado. Isto é o que o -argumento passado para wgetdepois -Oestá fazendo.
  • Para ler da entrada padrão em vez de um arquivo nomeado. É para isso que o -argumento foi passado tardepois xzf.

O comando que você mostrou faz o download de um arquivo wgetmorto e o descompacta tar. Para conseguir isso, a saída de wgeté canalizada ( |) para a entrada de tar. É por isso que wgetgrava na saída padrão em vez de em um arquivo e tarlê na entrada padrão em vez de em um arquivo.

Eliah Kagan
fonte
Eu diria "a maioria dos comandos" em vez de apenas "alguns comandos". Eu acredito que faz parte da especificação de sintaxe da opção POSIX.
Barmar 18/06
2
@Barmar Sim e não: Diretriz 13: Para utilitários que usam operandos para representar arquivos a serem abertos para leitura ou gravação, o operando '-' deve ser usado para significar apenas entrada padrão (ou saída padrão quando estiver claro no contexto que um arquivo de saída está sendo especificado) ou um arquivo chamado -. . Então , se - é um operando de uma "opção de arquivo" e isso tem um significado especial, em seguida, ele deve ser o de stdin / stdout. O programa é livre para não ser tratado como um caso especial e simplesmente procurar um arquivo-
Bakuriu
(e geralmente nesses casos, omitir a opção será o mesmo que usar -)
Bakuriu
@ Bakuriu Não vejo como isso refuta o que eu disse. Eu suspeito que a maioria dos comandos usa argumentos de nome de arquivo, então eles devem seguir essa orientação. Mas talvez eu devesse tê-lo qualificado como "a maioria dos comandos que operam em arquivos".
Barmar 19/06
1
@ Barmar Uma maneira de seguir a diretriz é recusar o tratamento -especialmente, tratando-o como um nome de arquivo literal. A única maneira de ir contra a diretriz é tratando -especialmente, mas com algum outro significado que não o sugerido pela diretriz.
Eliah Kagan 19/06
12

Esse é apenas um nome de arquivo que muitos programas Unix interpretam como "em vez de realmente abrir um arquivo, ler stdin(ou escrever para stdout)".

Isso significa ler da entrada que é transmitida para o programa; no seu caso, essa é a saída do wget.

Marcus Müller
fonte
6
É realmente um nome de arquivo ?
Eric Duminil 18/06
7
@EricDuminil É um nome de arquivo no sentido de que os programas o aceitam em alguns lugares em que apenas aceitariam nomes de arquivos, mas você está certo de que não se trata realmente do nome real de um arquivo em algum diretório.
JoL 18/06
5
@ EricDuminil: Em particular, para programas que seguem esta convenção, você deve usar ./-se realmente deseja abrir um arquivo chamado -.
Jörg W Mittag
4
@EricDuminil De fato: sim! Ele nomes de arquivo ; no sentido unix, stdiné um descritor de arquivo e -é o nome que você fornece para usá-lo. Porém, não é um nome de arquivo da perspectiva do sistema operacional. Somente da perspectiva do usuário.
Marcus Müller
3
@rexkogitans no. /dev/stdiné apenas um nome de arquivo de conveniência oferecido por algumas instalações do kernel. Geralmente não fopen("/dev/stdin", "r") acontece nada em nenhum lugar quando você escreve um programa que escolhe usar stdin; você apenas segue em frente e usa o extern FILE* stdinque seu cabeçalho libc lhe forneceu; a propósito, esse é o descritor de arquivo inteiro 0.
Marcus Müller
5

O -argumento para tarespecifica que o arquivo deve ser lido em stdinvez de um arquivo. No manual do GNU tar :

Se você usar -como nome de arquivo , tarlê o arquivo a partir da entrada padrão (ao listar ou extrair arquivos)

Outros comandos têm o mesmo comportamento e é especificado pelo padrão POSIX.1-2017 :

Diretriz 13 :

Para utilitários que usam operandos para representar arquivos a serem abertos para leitura ou gravação, o -operando ' ' deve ser usado para significar apenas entrada padrão (ou saída padrão quando fica claro no contexto que um arquivo de saída está sendo especificado) ou um arquivo nomeado -.

Tim
fonte