Por que o `tar -xvfz` falha, mas o` tar xvfz` funciona?

41

tar -xvfz foo.tar.gz retorna um erro tar: z: Cannot open: No such file or directory

Isso é completamente compreensível - o fswitch espera um nome de arquivo e, portanto, precisa ser o último.

No entanto, omitir o hífen tar xvfz foot.tar.gzfunciona, descompacta e descompacta o arquivo.

Eu testei isso no OS X 10.8 e no Ubuntu 12.04.

Alguma idéia do porquê?

[editado para adicionar]

Eu sempre uso tar -zxvf foo.tar.gz. No entanto, essa pergunta surgiu por causa desse xkcd , e minha surpresa quando alguém insistiu que tar xvfzfuncionaria.

insira a descrição da imagem aqui

anu
fonte
12
Então desculpe: xkcd.com/1168
MichaelHouse

Respostas:

61

O tar possui 3 tipos de sintaxe (de acordo com isso ):

  • opções longas (--file)
  • opções curtas (-f)
  • opções antigas (f)

Para a sintaxe da opção antiga, todas as letras devem seguir "tar" e devem cair em um único grupo sem espaços. A ordem das letras realmente não importa, desde que os argumentos dessas cartas sigam a mesma ordem após o grupo de opções.

Essa maneira antiga de escrever opções de tar pode surpreender até usuários experientes. Por exemplo, os dois comandos:

 # tar cfz archive.tar.gz file
 # tar -cfz archive.tar.gz file

são bem diferentes. O primeiro exemplo usa 'archive.tar.gz' como o valor da opção 'f' e reconhece a opção 'z'. O segundo exemplo, no entanto, usa 'z' como o valor da opção 'f' - provavelmente não o que foi planejado.

As opções antigas são mantidas para compatibilidade com versões antigas do tar.

O comando com '-' é equivalente a

tar -czf archive.tar.gz file
tar -cf archive.tar.gz -z file
tar cf archive.tar.gz -z file

Essa é a razão pela qual seu exemplo está funcionando sem um "-" e não com "-"

GeekRide
fonte
3
wtf unix
BlueRaja 02/02