A ordem das opções de comando no linux é importante?

12

Por exemplo, quando eu entrei:

gcc -O hello.c -c

Ou

gcc hello.c -c -O

Ambos não reclamaram.

A ordem das opções de comando é importante?

    
por bobo 07.02.2010 / 02:15

4 respostas

17

Isso depende do programa em si; o sistema operacional não determina se a ordem é ou não importante.

O conjunto de opções do GCC é tão colossal que não posso dizer com qualquer autoridade se você puder fornecer qualquer opção em ordem arbitrária; você terá que ler a documentação para essa opção. Dito isso, uma regra geral é que, se você tiver duas ou mais opções mutuamente exclusivas (como -O1 -O2 para diferentes níveis de otimização), os programas geralmente terão opções posteriores às anteriores. Novamente, isso não é imposto pelo Linux.

Um programa simples que permite especificar a maioria das opções em qualquer ordem seria ls . Listar todos os arquivos no diretório atual com detalhes pode ser feito com ls -la , ls -al ou ls -l -a . No entanto, ls-l1 (que é 'el' 'one') não fornece a mesma saída que ls -1l ('one' 'l'). Estas são opções mutuamente exclusivas, e as últimas listadas acima montam as primeiras dadas.

Existe também o programa ímpar que aplica opções aos argumentos conforme eles chegam. Portanto, por exemplo, você pode ter um comando hipotético blah -a 1 2 -b 3 , em que -a se aplica a todos os três argumentos, mas -b se aplica apenas a 3 .

Novamente, isso depende do programa individual em questão. Se você não tiver certeza, leia a documentação.

    
por 07.02.2010 / 02:36
4

Existem casos em que a ordem das opções de linha de comando é importante mesmo no GCC. Se você estiver vinculando a bibliotecas estáticas (.a), se você especificar -llib1 -llib2 e houver uma função em liblib2.a que chame uma função em liblib1.a que não foi trazida para o programa, o link falhará com um símbolo não resolvido. Com bibliotecas compartilhadas, isso não é um problema.

Em geral, como outros disseram, a ordem das opções pode ou não fazer diferença. No entanto, a saída dos dois comandos abaixo são diferentes - portanto, a ordem dos argumentos para cat altera a saída:

cat /etc/passwd /etc/group
cat /etc/group  /etc/passwd

Note também que no Linux (em particular), GNU getopt() está apto a reordenar a linha de comando para que todas as opções (começando com menos) sejam processadas antes de qualquer um dos outros argumentos - a menos que você use double-dash -- para marcar o final dos argumentos, ou a menos que você defina a variável de ambiente POSIXLY_CORRECT.

    
por 07.02.2010 / 06:44
4

Somente se você tiver duas opções que sejam mutuamente exclusivas. Caso contrário, a ordem não importa.

Claro, isso pode variar dependendo de como o programa foi escrito, mas deve se aplicar a todas as ferramentas normais * nix.

    
por 07.02.2010 / 02:17
3

Difícil saber, como outros já disseram que pode fazer a diferença (ou não).

Uma boa regra é abrir a página do manual e olhar o primeiro exemplo e usar essa ordem ao colocar o argumento lá.

Então, se olharmos para o comando cat (man cat):

SYNOPSIS
       cat [OPTION] [FILE]...

Parece que, desde que todas as opções estejam antes do arquivo args, você deve estar bem.

E se olharmos para a fera do gcc (man gcc):

SYNOPSIS
       gcc [-c|-S|-E] [-std=standard]
           [-g] [-pg] [-Olevel]
           [-Wwarn...] [-pedantic]
           [-Idir...] [-Ldir...]
           [-Dmacro[=defn]...] [-Umacro]
           [-foption...] [-mmachine-option...]
           [-o outfile] [@file] infile...

       Only the most useful options are listed here; see below for the remainder.  g++ accepts mostly
       the same options as gcc.

Não é tão simples de entender como o comando cat:)

Mas se você quiser jogar com segurança, -c parece vir antes -O e depois o infile (hello.c) parece ser o último.

gcc -c -O hello.c

Mas como você já sabe, já que os outros trabalham ... isso é muito seguro:)

    
por 07.02.2010 / 08:18