Por que usar traço supérfluo (-) para passar sinalizadores de opção para tar?


35

Para criar um arquivo tar para um diretório, o tarcomando com compress, verbosee fileopções podem ser digitados da seguinte maneira:

$ tar -cvf my.tar my_directory/

Mas também funciona para fazê-lo desta maneira:

 $ tar cvf my.tar my_directory/

Ou seja, sem o traço (-) que precede as opções. Por que você passaria um traço (-) para a lista de opções?


Respostas:


43

Existem vários padrões diferentes para opções que foram usadas historicamente em aplicativos UNIX. Vários antigos, como o tar , usam um esquema posicional:

argumentos de opções de comando

como por exemplo, o alcatrão usa

arquivo tar * something * f "operado em" * "caminhos de arquivos para manipular" *

Em uma primeira tentativa de evitar a confusão, o tar e alguns outros programas com o velho estilo de argumentos de bandeiras permitiram delimitar as bandeiras com traços, mas a maioria de nós simplesmente ignorou isso.

Alguns outros comandos têm uma sintaxe de linha de comando mais complicada, como dd (1), que usa bandeiras, sinais de igual, nomes de caminho, argumentos e uma perdiz em uma pereira, todos com abandono.

No BSD e nas versões posteriores do unix, isso tinha convergido mais ou menos para sinalizadores de caracteres únicos marcados com '-', mas isso começou a apresentar alguns problemas:

  • as bandeiras podem ser difíceis de lembrar
  • às vezes você realmente queria usar um nome com '-'
  • e especialmente com as ferramentas GNU, começou a haver limitações impostas pelo número de sinalizadores possíveis. Então, as ferramentas GNU adicionaram opções longas do GNU, como --output.

Em seguida, a Sun decidiu que o '-' extra era redundante e começou a usar sinalizadores de estilo longo com '-'s únicos.

E foi assim que surgiu a bagunça que está agora.


9
"e uma perdiz numa pereira" Melhor do que minha tentativa seca. Você ganha.
dmckee

11
bom contexto histórico.

11
Percebo que muitos programas X (incluindo, digamos, X, do Xorg), usam sinalizadores de estilo longo com um único -. Isso é da Sun?
Mattdm 22/11/11

11
Qual é o significado de "perdiz em uma pereira"? (Posso ter qualquer link útil e fácil de entender?)
plhn

11
@plhn Idiom. Uma canção de Natal tradicional inglesa "Os Doze Dias de Natal" lista um monte de presentes extravagantes, terminando com "uma perdiz numa pereira". Isso sugere uma longa lista extravagante.
Charlie Martin

8

Você pode fornecer opções tar da maneira unix padrão, na tar -c -f foo -v -B file1 file2 file3qual você precisa que o traço diferencie entre opções e parâmetros ou os nomes de arquivo no final da linha de comando. Ou você pode reunir todas as opções no primeiro argumento, caso em que o traço é opcional.

Depois, há psonde você usa os hífens se estiver usando as opções SysV-ish e os deixa de fora se estiver usando as opções BSD-ish, apenas para tornar as coisas mais confusas.

E não vamos nem falar find.


2

O traço é usado para desambiguar entre os nomes e valores de parâmetros de uma opção. Eu acho que é mais uma convenção padrão.


11
Eu estava indo para adicionar a best-practicetag, porque eu pensei que pode se resumir a isso.

11
@ Milktrader, é uma pergunta difícil quando se fala em melhores práticas. Seguir as convenções padrão é realmente uma prática recomendada, mas se você deseja fazê-lo nos seus casos, não está claro. Vai depender do seu cenário. Se você estiver hackeando algum comando rápido no shell, provavelmente não se importaria muito com isso, mas se estiver escrevendo uma biblioteca, é importante seguir convenções bem estabelecidas, porque você não tem controle de como essa biblioteca será usada. pelos clientes. Nesse caso, você deve cobrir todos os casos possíveis e é importante desambiguar entre nomes e valores de opções.

-1

Existem até quatro convenções para usar as opções de linha de comando unix:

  1. -o -p -t (traço antes de cada opção)
  2. -opt (traço antes de um conjunto de opções)
  3. opt (sem traço antes de um conjunto de opções)
  4. --long-option (traço duplo antes do nome de uma opção)

Por exemplo:

$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract -verbose -gzip -file package.tar.gz

11
Essa convenção é aplicável apenas ao alcatrão? E quanto a ls? ls lrt não funcionará, mas ls -lrt / ls -l -r -t funcionará. Por quê?
Shashank Vyas

As quatro convenções devem funcionar para todos os comandos.
jonasjacek

2
Não, eles não. No outro dia, tentei rm rf <filename>, que também não funciona.
Shashank Vyas

-2

Com o sinal de menos / traço (-), você precisa manter as opções em ordem precisa. Sem menos ordem de sua opção pode mudar.

Por exemplo:

# tar -xvf yourfile.tar
# tar vxf yourfile.tar

Esta resposta está parcialmente correta, mas, no AFAIK, apenas bandeiras como fessa levam um argumento cuja ordem é importante. Veja unix.stackexchange.com/a/239120/3169
Mikel
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.