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


14

Por exemplo, quando eu digitei:

gcc -O hello.c -c

Ou

gcc hello.c -c -O

Ambos não reclamaram.

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

Respostas:


18

Isso depende do próprio programa; o sistema operacional não determina se o pedido é ou não importante.

O conjunto de opções do GCC é tão colossal que não posso dizer com nenhuma autoridade se você pode fornecer qualquer opção em ordem arbitrária; você terá que ler a documentação dessa opção. Dito isso, uma regra geral é que, se você tiver duas ou mais opções mutuamente exclusivas (como -O1 -O2para 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. A listagem de todos os arquivos no diretório atual com detalhes pode ser feita com ls -la, ls -alou ls -l -a. No entanto, ls -l1 (que é 'el' 'one') não fornece a mesma saída que ls -1l ('one' 'l'). Essas são opções mutuamente exclusivas, e as últimas listadas são as primeiras.

Há também o programa ímpar que aplica opções aos argumentos quando eles chegam. Portanto, por exemplo, você pode ter um comando hipotético blah -a 1 2 -b 3onde -ase aplica a todos os três argumentos, mas -bsomente a 3.

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


5

Há casos em que a ordem das opções da linha de comando é importante, mesmo no GCC. Se você estiver vinculando com bibliotecas estáticas (.a), se especificar -llib1 -llib2e houver uma função liblib2.aque chame uma função liblib1.aque 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 é diferente - portanto, a ordem dos argumentos cataltera a saída:

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

Observe também que no Linux (em particular), o GNU getopt()pode reordenar a linha de comando para que todas as opções (começando com menos) sejam processadas antes de qualquer outro argumento - a menos que você use traço duplo --para marcar o final do argumentos, ou a menos que você defina a variável de ambiente POSIXLY_CORRECT.


4

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

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


3

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

Uma boa regra geral é abrir a página de manual, observar 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, você deve estar bem.

E se olharmos para a besta 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 pelo seguro, -c parece vir antes de -O e, em seguida, infile (hello.c) parece ser o último.

gcc -c -O hello.c

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


E quanto a vincular sinalizadores como -static-libstdc++?
Royi 02/09/19
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.