As definições base do POSIX tem uma seção sobre " Convenções de utilidade " que se aplica ao POSIX utilitários de base.
O utilitário getopts
padrão e o getopt()
("função C") segue as diretrizes (mais abaixo na página vinculada acima) ao analisar o comando linha em um script de shell ou programa C. Especificamente, para getopts
(como um exemplo):
When the end of options is encountered, the
getopts
utility shall exit with a return value greater than zero; the shell variableOPTIND
shall be set to the index of the first operand, or the value"$#" +1
if there are no operands; thename
variable shall be set to the character. Any of the following shall identify the end of options: the first--
argument that is not an option-argument, finding an argument that is not an option-argument and does not begin with a-
, or encountering an error.
O que isso basicamente diz é que as opções devem vir primeiro e, em seguida, operandos (seu "comando ou arquivo").
Fazê-lo de outra maneira renderizaria usando getopts
ou getopt()
impossível, além de confundir os usuários acostumados com a maneira POSIX de especificar opções e operandos para um comando.
Observe que o padrão mencionado acima se aplica apenas aos utilitários POSIX, mas, como tal, define uma precedência para os utilitários Unix em geral. Os utilitários não-padrão do Unix podem optar por seguir ou quebrar isso, obviamente.
Por exemplo, os coreutils GNU, mesmo que implementem os utilitários padrão, permitem coisas como
$ ls Documents/ -l
se a variável de ambiente POSIXLY_CORRECT
não estiver definida, enquanto a versão BSD dos mesmos utilitários não.
Isto tem como consequência que o seguinte funciona como esperado (se você espera um comportamento POSIX, isto é) em um sistema BSD:
$ touch -- 'test' '-l'
$ ls -l test -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 test
Mas em um sistema GNU coreutils, você obtém
$ ls -l test -l
-rw-r--r-- 1 kk kk 0 Jan 11 16:44 test
No entanto:
$ env POSIXLY_CORRECT=1 ls -l test -l
e
$ ls -l -- test -l
fará a coisa "certa" em um sistema GNU também.