Qual é a diferença entre - (um hífen) e - (dois hífens) em um comando? [duplicado]

14
    

Esta pergunta já tem uma resposta aqui:

    
  •              Quais são as diferenças entre “-” e “-” em comandos?                                      2 respostas                          
  •         
  •              Quando as opções de comando estão prefixadas com dois hifens '-'? [duplicado]                                      4 respostas                          
  •     

Ambos parecem ser bandeiras, mas qual é a diferença?

    
por AlphaOmega 17.08.2016 / 12:26

4 respostas

24
  • -- é a versão do nome longo
  • - é a versão de nome abreviado

Veja man ls e algumas das opções:

-a, --all : do not ignore entries starting with .
-A, --almost-all : do not list implied . and ..
-b, --escape : print C-style escapes for nongraphic characters
-B, --ignore-backups : do not list implied entries ending with ~

Eles são os mesmos, mas alguns preferem os curtos, outros as versões longas.

E ambos estão lá para compatibilidade. Remover uma opção quebra o software.

Nem todo comando segue isso. Como @ Bakuriu menciona no comentário: um comando como find tem o que você pode considerar "nomes longos" com 1 hífen.

Com relação à codificação, há algo a ser observado também:

por Rinzwind 17.08.2016 / 12:40
21

Geralmente:

  • - significa ler o argumento / conteúdo de STDIN (descritor de arquivo 0)

  • -- significa opções de fim de comando, tudo segue que são argumentos

Por que necessário:

Sobre - :

$ echo foobar | cat -
foobar

Embora cat possa ler o conteúdo de STDIN sem precisar do - , muitos comandos precisam disso e suas man páginas mencionam isso explicitamente.

Agora, sobre -- , criei um arquivo -spam , vamos cat o arquivo:

$ echo foobar >-spam  

$ cat -spam         
cat: invalid option -- 'p'
Try 'cat --help' for more information.

$ cat -- -spam      
foobar

Sem -- , cat usa s , p , a , m all, pois as opções seguem - , -- indica explicitamente o fim da (s) opção (ões) , depois que -spam é considerado um nome de arquivo.

    
por heemayl 17.08.2016 / 12:36
6

Isso realmente depende do programa em questão. Existem padrões, mas eles não são realmente aplicados em qualquer lugar: cabe a cada programa implementá-los.

O comando find , por exemplo, usa parâmetros de nome completo com hífens simples:

find . -iname "*.jpg" -delete

No entanto, em geral, hifens duplos indicam um comutador que é uma palavra completa e hífens simples indicam um swich que é uma única letra. E os switches de uma única letra podem ser combinados, o que significa que todos os comandos a seguir são equivalentes:

cp --verbose --recursive /dir/from /dir/to
cp -v -r /dir/from /dir/to
cp -vr /dir/from /dir/to

Um hífen duplo seguido por um espaço também pode ser usado para indicar "este é o fim dos comandos; tudo o que se segue é um nome de arquivo, mesmo que pareça um comando".

E um único hífen sem letras a seguir pode indicar "lida de stdin, não de um arquivo".

No entanto, tudo isso depende do programa . Qualquer programa dado pode violar qualquer um desses padrões, como visto, por exemplo, com find .

    
por TRiG 17.08.2016 / 17:27
3

Um hífen é o caminho que opções para um comando tradicionalmente foi dado aos comandos Unix. Eles têm um hífen seguido por uma única letra (ou às vezes um número) ( -a -i -T ). Algumas opções são seguidas por um argumento ( -ofilename -o filename ).

Dois hífens são usados principalmente - e são a maneira preferida de dar opções - para programas / comandos em sistemas GNU - ie. principalmente em sistemas Linux. Eles têm dois hipens seguidos de uma ou mais palavras separadas por hipens simples ( --version --ignore-case ). Opções com argumentos usa um sinal de igual para separar opção e argumento ( --log-file=filename )

A desvantagem com as opções antigas de um-hypen é que não há uma carta padrão para fazer a mesma coisa sobre comandos diferentes. Sim, -v é frequentemente usado para "verbose" - e -V é algumas vezes usado para "versão" - mas não há consesnsus reais entre os comandos. Por exemplo, -i significa "interativo" para cp , mv , ln e rm - o comando solicitará antes de sobrescrever ou excluir. Mas isso significa "ignorar maiúsculas e minúsculas" em grep . Para dificultar ainda mais, o comando sort usa -f - para "fold case" - da mesma forma, para ignorar letras maiúsculas e minúsculas. Para completar a confusão, muitos comandos - incluindo mv e cp - usam -f para "força" ... que o comando deve fazer algo (como sobrescrever um arquivo existente), mesmo que normalmente não fosse.

Além disso, os comandos para diferentes sistemas Unix (Solaris, * BSD, SysV, AIX, ...) podem usar letras diferentes para fazer a mesma coisa. Por exemplo, o comando who lista os usuários em um sistema. Esse comando pode, opcionalmente, mostrar quais usuários aceitam mensagens de outros usuários em seus terminais - a opção para isso é -w no Linux, enquanto o Solaris usa -T .

As opções longas, por outro lado, permitem que a mesma opção seja usada em todos os comandos e, na verdade, descrevem o que as opções fazem. Por exemplo, --ignore-case , --interactive , --version , --force . Assim, --ignore-case é usado em grep e sort .

Mas, novamente, eles são quase usados apenas em comandos / programas feitos como parte do projeto GNU ...

Finalmente, um hypen duplo é usado para dizer a um comando que a lista de opções está concluída, e que o que segue são argumentos - não importa o quanto eles possam parecer opções. Se um nome de arquivo começar com um hífen (por exemplo, -this_is_a_bad_filename ), os comandos podem confundi-lo com uma opção e tentar analisá-lo - o hífen duplo evita isso. mv -vi -- -this_is_a_bad_filename this_is_a_better_filename (o único comando que você deve usar se um nome de arquivo começar com um hífen ...; -)

    
por Baard Kopperud 17.08.2016 / 17:36