Posso usar 'type' para verificar se um nome arbitrário é um nome de comando válido?

1

O bash type incorporado pode ser usado para essa finalidade, verificando seu status de saída:

Exit Status:
Returns success if all of the NAMEs are found; fails if any are not found.

Qual a sua portabilidade? A especificação POSIX é um pouco menos clara em relação ao status de saída de type :

EXIT STATUS    
    The following exit values shall be returned:    
     0 Successful completion.
    >0 An error occurred.

Fonte: link

    
por Ernest A 07.01.2014 / 16:05

2 respostas

1

DESCRIPTION

The type utility shall indicate how each argument would be interpreted if used as a command name.

(…)

The following exit values shall be returned:

0 Successful completion.
>0 An error occurred.

“Conclusão bem-sucedida” significa que o argumento pode ser interpretado como um nome de comando, caso em que a consulta de comando será bem-sucedida. Um erro significa que o argumento não pode ser interpretado como um nome de comando, caso em que a pesquisa de comandos falharia.

O status de retorno de type é uma maneira totalmente POSIX-portátil de verificar se um nome de comando é válido ou o mais próximo possível. Existem sistemas mais antigos em que type retorna 0 em comandos inválidos (como OSF1 V3, mas acho que OSF1 V4 é compatível com POSIX, pelo menos quando o ambiente shell está no modo POSIX ( BIN_SH=xpg4 )), mas compatível com POSIX os sistemas retornam 0 somente após o sucesso.

O que você não pode confiar com type é o formato de saída, ou se a saída será em stdout ou stderr.

É impossível garantir que o resultado de type corresponda ao que acontece se você tentar realmente executar o programa. Um executável pode ter sido adicionado ou removido nesse meio tempo, ou pode falhar ao carregar porque o arquivo é inválido ou porque não há memória suficiente. Mas se você está apenas olhando para ver se um comando existe e não está preocupado com casos de borda, if type somecommand >/dev/null 2>/dev/null; … é o caminho certo.

    
por 08.01.2014 / 02:07
1

Você está certo, usando a especificação POSIX como guia, não há como dizer o que é considerado um erro. Portanto, não há como garantir que um código de saída zero significa que o operando é um nome válido, muito menos que seja um comando.

Parece que a saída padrão também não ajuda muito (minha ênfase):

The standard output of type contains information about each operand in an unspecified format. The information provided typically identifies the operand as a shell built-in, function, alias, or keyword, and where applicable, may display the operand's pathname.

Parece que você terá que usar alguma heurística, por exemplo, com base no shell que está usando.

    
por 07.01.2014 / 16:37