tar e suas letras principais: é um bug ou recurso?

16

Gostaria de perguntar a diferença entre esses dois comandos (ou seja, somente a ordem de suas opções é diferente):

  1. tar -zxvf foo.tar.gz
  2. tar -zfxv foo.tar.gz

O primeiro correu perfeitamente, mas o segundo disse:

tar: You must specify one of the '-Acdtrux' or '--test-label'  options
Try 'tar --help' or 'tar --usage' for more information.

e tar com --test-label e -zfxv disseram:

tar (child): xv: Cannot open: No such file or directory
tar (child): Error is not recoverable: exiting now
tar: Child returned status 2
tar: Error is not recoverable: exiting now

Então eu olhei para o manual do alcatrão e percebi que todo o exemplo está usando o interruptor -f no final !!

AFAICT não há necessidade dessa restrição, ou está lá ?! porque, na minha opinião, os switches devem ser livres de pedidos.

    
por khikho 22.09.2015 / 10:57

4 respostas

11

Analisando sua mensagem de erro, é óbvio que você não usou tar , mas sim gtar .

Em geral, isso pode ajudar a entender as coisas:

  • tar normalmente sempre precisa de um argumento de arquivo. Se estiver faltando, ele irá ler / gravar de / para o dispositivo de fita real padrão do sistema. star mudou isso em 1982 para usar stdin / stdout por padrão e algumas outras implementações de tar (por exemplo, gtar) seguiram esse exemplo recentemente.

  • tar não implementa o - para as opções que são chamadas key letters no caso do comando tar. Algumas implementações posteriormente adicionaram - como uma letra-chave não operacional para a conveniência dos usuários, mas você não pode confiar nisto.

  • A maneira como tar analisa seus argumentos (em particular o argumento do arquivo archive) é altamente arriscada. Eu tenho visto muitos arquivos tar que destruíram um dos arquivos que deveriam estar no arquivo porque o argumento do arquivo relacionado foi tomado como arquivo tar. star por esse motivo (se chamado nativamente como star ) não permite que "f" seja concatenado com outras opções. Se star for chamado de tar , implementará a compatibilidade da linha de comando com tar , mas ainda tratará o argumento da letra "f" de maneira diferente: o argumento só será permitido se se referir a um arquivo de dispositivo real ou write mode) o arquivo ainda não existe.

Eu recomendo evitar a arriscada linha de comando original do tar e usar a sintaxe moderna e segura da linha de comando que você obtém com star .

Devido à problemática sintaxe da linha de comando de tar , havia o chamado tar wars no início dos anos 90. Como resultado, o programa pax (latim para "paz" nas guerras de alcatrão) foi criado e padronizado. No entanto, pax não ganhou popularidade, pois sua sintaxe é menos arriscada, mas também menos intuitiva que a sintaxe de tar. Outro problema pode ser que gpax seja mais ou menos não mantido.

    
por 22.09.2015 / 11:57
55

A ordem das opções é gratuita, mas -f tem um argumento obrigatório, que é o arquivo que tar irá ler / escrever.

Você poderia fazer

tar -zf foo.tar.gz -xv

e isso vai funcionar, e tem sua exigência de uma ordem não específica de switches.

É assim que todos os comandos que possuem opções com argumentos funcionam.

    
por 22.09.2015 / 11:04
14

Tradicionalmente, as opções do tar são mais ou menos "livres de pedido" (a ordem das opções f e b importa se ambas forem especificadas). Usar um traço principal, no entanto, faz com que o GNU tar analise as opções de uma maneira considerada mais consistente com outros comandos, onde especificar uma opção que requer um argumento (como o nome do arquivo para f ) consumirá imediatamente o restante do word ", se houver, como o argumento (tradicionalmente, o tar usa a palavra next como o nome do arquivo / tamanho do bloco quando f ou b é especificado). No seu caso, foi necessário "xv" como nome do arquivo.

Esse comportamento não pode ser confiável para portabilidade, no entanto. Para máxima portabilidade, você deve evitar usar um traço, sempre coloque f por último e sempre coloque um espaço entre f e o nome do arquivo. Essa é, no entanto, uma simplificação que é quebrada se você precisar da opção b ou, em geral, de qualquer opção (como C ) diferente de f que exija um argumento.

Isso está documentado na seção Manual do Alcatrão "Os Três Estilos de Opção" . Algumas outras implementações (por exemplo, FreeBSD) referem-se às opções de estilo antigo como uma "palavra de opção agrupada". E, claro, algumas implementações podem apenas suportar este tipo de opção, e podem ou não ignorar um traço se estiverem incluídas. Esta é a única forma de chamada especificada na Especificação Unix Única e, portanto, garantida para funcionar em quase todos os sistemas.

    
por 22.09.2015 / 17:40
0

No tar, o - nos switches foi preterido há muitos anos e não é mais necessário. Tar realmente costumava te dizer isso, mas não faz mais isso.

ie:
tar zxvf foo.tar.gz
tar zfxv foo.tar.gz

Both of these work fine without the -.
    
por 12.10.2015 / 10:17