Por que a sequência específica de opções é importante para o comando tar?

6

Eu estava experimentando o comando tar para criar um arquivo com a extensão .tar .

por favor, veja a seguinte série de comandos que experimentei:

$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cfv test.tar *.jpg
tar: test.tar: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
$ ls
abc.jpg  hello.jpg  v  xjf.jpg
$ rm v
$ ls
abc.jpg  hello.jpg  xjf.jpg
$ tar -cvf test.tar *.jpg
abc.jpg
hello.jpg
xjf.jpg
$ ls
abc.jpg  hello.jpg  test.tar  xjf.jpg

por que dá resposta diferente com seqüência diferente de opções? Por exemplo,-cfv vs cvf . pelo que aprendi no bash scripting, essa sequência de opções não importa.

    
por Edward Torvalds 02.03.2015 / 17:32

3 respostas

10

Como @jcbermu disse, para a maioria dos programas e na maioria dos casos, a ordem dos sinalizadores de linha de comando não é importante. No entanto, alguns sinalizadores esperam um valor. Especificamente, o sinalizador -f do tar é:

  -f, --file ARCHIVE
       use archive file or device ARCHIVE

Portanto, tar espera que -f tenha um valor e esse valor seja o nome do arquivo tar criado. Por exemplo, para adicionar todos os arquivos .jpg a um arquivo chamado foo.tar , você executaria

tar -f foo.tar *jpg

O que você estava executando era

tar -cfv test.tar *.jpg

tar entende como "create ( -c ) um arquivo chamado v ( -fv ), contendo arquivos test.tar e qualquer final em .jpg .

Quando você executa tar -cvf test.tar *.jpg , por outro lado, é preciso usar test.tar como nome do arquivo e *jpg como a lista de arquivos.

    
por 02.03.2015 / 17:46
9

O pedido não importa, desde que a opção não precise de um valor. No seu caso, -f precisa especificar um nome de arquivo.

No primeiro caso ( tar -cfv ) o comando acredita que os nomes dos arquivos de saída são v porque são depois de -f .

    
por 02.03.2015 / 17:41
5

Enquanto outros apontaram que o tratou como -c -f v , sinto que devo observar que isso é feito apenas porque o traço foi usado e esse comportamento não se aplica a todas as versões do tar. No modo legado (sem traço), o tar trata especialmente o primeiro argumento, e um "f" ou "b" dentro dele consumirá as próximas palavras completas após as opções (assim tar cfb file.tar 20 ou tar cbf 20 file.tar ). Para o GNU tar, você pode encontrar mais detalhes na documentação completa do Texinfo rodando info tar styles .

Em geral, você não deve confiar em nenhum comportamento e sempre especificar f como a última opção e colocar um espaço entre ele e o nome do arquivo. ( -b é importante apenas em algumas situações ao gravar em unidades de fita físicas, portanto, pode ser ignorado para essa discussão.)

    
por 02.03.2015 / 20:11

Tags