A ordem dos parâmetros é importante para o tar? [duplicado]

16

Estou aprendendo Linux. Fiquei surpreso ao ver que a ordem dos parâmetros parece importar ao fazer um tarball.

tar -cfvz casual.tar.gz snapback.txt bucket.txt

indica o erro:

tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

Mas se eu emitir o comando assim:

tar -cvzf casual.tar.gz snapback.txt bucket.txt

o tarball é criado sem erros

Alguém pode me explicar por que a ordem dos parâmetros é importante neste exemplo ou onde posso encontrar essas informações para saber por quê? Eu tentei do jeito que eu fiz no meu primeiro exemplo que recebeu um erro com a lógica de colocar os parâmetros requeridos c e f primeiro seguido pelos meus outros parâmetros.

Eu quero absorver completamente o Linux, o que inclui entender por que coisas assim ocorrem. Obrigado antecipadamente!

    
por BitBug 28.10.2015 / 04:36

2 respostas

30

Se o pedido é importante depende de você iniciar as opções com menos

$ tar -cfvz casual.tar.gz snapback.txt bucket.txt
tar: casual.tar.gz: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors

$ tar cfvz casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt

Esse comportamento incomum está documentado na página do manual

 Options to GNU tar can be given in three different styles.
 In traditional style
 ...
 Any command line words that remain after all options has
 been processed are treated as non-optional arguments: file or archive
 member names.
 ...
 tar cfv a.tar /etc
 ...
 In UNIX or short-option style, each option letter is prefixed with a
 single dash, as in other command line utilities.  If an option takes
 argument, the argument follows it, either as a separate command line
 word, or immediately following the option.
 ...
 tar -cvf a.tar /etc
 ...
 In GNU or long-option style, each option begins with two dashes and
 has a meaningful name
 ...
 tar --create --file a.tar --verbose /etc

tar , que é a abreviação de "archive de fita", existe antes de as convenções atuais serem decididas, por isso, mantém os diferentes modos de compatibilidade.

Então, para "absorver o Linux", sugiro algumas lições iniciais:

  • leia sempre a página do manual
  • pequenas diferenças na sintaxe são por vezes importantes
    • a posição dos itens - a maioria dos comandos exige que as opções sejam a primeira coisa após o nome do comando
    • se um sinal de menos é necessário (como tar , ps funciona de forma diferente, dependendo de haver menos no início)
    • se um espaço é opcional, obrigatório ou não deve estar lá ( xargs -ifoo é diferente de xargs -i foo )
  • algumas coisas não funcionam da maneira esperada

Para obter o comportamento desejado no estilo normal, coloque o nome do arquivo de saída diretamente após o f ou -f , por exemplo

$ tar -cvzf casual.tar.gz snapback.txt bucket.txt
snapback.txt
bucket.txt

ou:

$ tar -c -f casual.tar.gz -z -v snapback.txt bucket.txt

ou você pode usar o menos comum, mas mais fácil de ler o estilo longo do GNU:

$ tar --create --verbose -gzip --file casual.tar.gz snapback.txt bucket.txt
    
por 28.10.2015 / 04:56
7

Verificando a opção -f na página do manual tar nos dá:

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

Isso significa que a próxima palavra que segue a opção -f será o nome do arquivo. No seu exemplo, após o -f , segue as letras vz , que serão usadas como o nome do arquivo.

Depois disso, analisa cada argumento como entrada para compactar no arquivo agora chamado vz . Quando ele tenta fazer isso, tar percebe que não há nenhum arquivo com o nome casual.tar.gz para compactar e, em seguida, fornece seu erro.

Portanto, após o -f , ele deve sempre seguir o nome do arquivo que você deseja produzir.

    
por 28.10.2015 / 04:51