Estou pensando em perguntar a diferença desses dois comandos (ou seja, apenas a ordem de suas opções é diferente):
tar -zxvf foo.tar.gz
tar -zfxv foo.tar.gz
O primeiro funcionou 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 alcatrão --test-label
e -zfxv
disse:
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 tar manual e percebi que todo o exemplo lá está usando switch -f
no final !!
AFAICT não há necessidade dessa restrição, ou existe ?! porque, na minha opinião, os switches devem ser livres de pedidos.
linux
command-line
tar
khikho
fonte
fonte
gtar option parsing
, descobriu outra razão para não usar o gtar.-f
espera que o nome do arquivo seja seguido. Na sua segunda versão, você especificou-fxv
, o que - para tar - significa que o nome do arquivo é "xv".Respostas:
Observando sua mensagem de erro, é óbvio que você não usou,
tar
mas simgtar
.Em geral, isso pode ajudar a entender as coisas:
tar
normalmente sempre precisa de um argumento de arquivo. Se estiver faltando, ele lerá / gravará de / no 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 tar (por exemplo, gtar) seguiram este exemplo recentemente.tar
não implementa as principais-
opções que são chamadaskey letters
no caso do comando tar. Algumas implementações foram adicionadas posteriormente-
como uma carta-chave não operacional para a conveniência dos usuários, mas você não pode confiar nisso.A maneira como
tar
analisa seus argumentos (em particular o argumento do arquivo morto) é altamente arriscada. Eu já vi 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 comostar
) não permite que "f" seja concatenado com outras opções. Sestar
for chamadotar
, implementa a compatibilidade da linha de comando comtar
, mas ainda lida com o argumento da letra "f" de maneira diferente: o argumento só é permitido se se referir a um arquivo de dispositivo real ou quando (no modo de gravação) o arquivo ainda não existe .Eu recomendo evitar a arriscada linha de comando tar original e usar a sintaxe moderna e segura da linha de comando que você utiliza
star
.Por causa da sintaxe problemática da linha de comando
tar
, havia as chamadastar wars
no início dos anos 90. Como resultado, o programapax
(latim para "paz" nas guerras do alcatrão) foi criado e padronizado.pax
no entanto, não ganhou popularidade, pois sua sintaxe é menos arriscada, mas também menos intuitiva que a sintaxe tar. Outro problema pode ser quegpax
é mais ou menos inalterado.fonte
star
?tar
ecpio
.star
é-f"$file"
também é (além deind
) um problema com nomes de arquivos começando com=
. Então é preciso escrevê-lo-f="$file"
ou-f "$file"
. Não sei se chamaria sua opção de estrela de mais segura ou moderna .-long
opções longas de estilo são incompatíveis com-xyz
opções curtas condensadas ou-xarg
. É por isso que as opções longas do estilo X11 exigem que as opções curtas sejam separadas (-x -y
, não-xy
) e os argumentos das opções estejam em argumentos separados (xterm -n foo
, nãoxterm -nfoo
). E é por isso que há um traço extra nas opções longas do GNU, para remover a possível confusão com opções curtas e por que as opções longas no estilo GNU são um design melhor. Você pode-foo
conviver-x -y -xy
apenas se tiver muito cuidado para evitar as sobreposições.A ordem das opções é gratuita, mas
-f
possui um argumento obrigatório, que é o arquivo quetar
será de leitura / gravação.Você poderia fazer
e isso funcionará e tem sua exigência de uma ordem não específica de comutadores.
É assim que todos os comandos que têm opções com argumentos funcionam.
fonte
-f=./myfile
, isto é, f assume um valor, não é uma bandeira, é uma entrada.Tradicionalmente, as opções do alcatrão são mais ou menos "sem pedidos" (a ordem das opções
f
eb
é importante se ambas forem especificadas). Usar um traço à esquerda, 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 exija um argumento (como o nome do arquivo paraf
) consumirá imediatamente o restante da "palavra", se houver, como o argumento (tradicionalmente, tar usa a próxima palavra como tamanho do nome do arquivo / bloco quandof
oub
é especificado). No seu caso, tomou "xv" como o nome do arquivo.Esse comportamento não pode ser invocado para a portabilidade, no entanto. Para máxima portabilidade, evite usar um traço, sempre coloque por
f
último e sempre coloque um espaço entref
e o nome do arquivo. Essa é, no entanto, uma simplificação que se quebra se você precisar dab
opção ou, em geral, qualquer opção (comoC
)f
que não seja a que exige 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) se referem às opções de estilo antigo como uma "palavra de opção empacotada". E, é claro, algumas implementações podem suportar apenas esse tipo de opção e podem ou não ignorar um traço, se incluídas. Essa é a única forma de chamada especificada na Especificação Unix Única e, portanto, garantida para funcionar em quase todos os sistemas.
fonte
C
no tar BSD ou GNU. O tar schily o suporta como -C, mas não como C, todos suportam como -C).No alcatrão, o - nos interruptores foi substituído há muitos anos e não é mais necessário. Tar realmente costumava lhe dizer isso, mas não o faz mais.
fonte