127 Código de retorno de $?

291

Qual é o significado do valor de retorno 127 de $? no UNIX.

Sachin Chourasiya
fonte

Respostas:

428

O valor 127 é retornado /bin/shquando o comando fornecido não é encontrado na PATHvariável do sistema e não é um comando shell interno. Em outras palavras, o sistema não entende seu comando, porque não sabe onde encontrar o binário que você está tentando chamar.

Oldskool
fonte
55
Isso também acontece se um script bash não tiver o modo "+ x", mas realmente existir.
MatthewKremer
3
Você pode tentar usar which [program]para ver qual binário o sistema operacional está usando. Se aparecer vazio, o próximo passo é verificar o bit de execução e o PATH.
four43
10
@ cr125rider, whichnão é particularmente preciso - não conhece aliases, funções de shell, memorização de pesquisa PATH ou outros fatores internos ao estado do shell. Muito melhor para usar type, um shell embutido que sabe sobre todas essas coisas.
Charles Duffy
5
Isso também aconteceu comigo com um arquivo com feeds de linha do Windows. A correção das terminações de linha no formato unix resolveu o problema
Mitkins
4
@ MatthewKremer: Na verdade, recebo 126( Permission denied), não 127quando tento invocar um arquivo não executável (independentemente de seu conteúdo); Da mesma forma, uma tentativa de executar um diretório também resulta em 126( is a directory).
precisa saber é o seguinte
58

Geralmente significa:

127 - comando não encontrado

mas também pode significar que o comando foi encontrado ,
mas uma biblioteca requerida pelo comando NÃO foi encontrada .

okigan
fonte
14

127 - command not found

exemplo: $ caat A mensagem de erro será

bash:

caat: comando não encontrado

agora você verifica usando echo $?

Anitha Mani
fonte
10

Uma convenção de shell é que um executável bem-sucedido deve sair com o valor 0. Qualquer outra coisa pode ser interpretada como uma falha de algum tipo, em parte do bash ou no executável que você acabou de executar. Consulte também $ PIPESTATUS e a seção EXIT STATUS da página do manual do bash:

   For  the shell’s purposes, a command which exits with a zero exit status has succeeded.  An exit status
   of zero indicates success.  A non-zero exit status indicates failure.  When a command terminates  on  a
   fatal signal N, bash uses the value of 128+N as the exit status.
   If  a command is not found, the child process created to execute it returns a status of 127.  If a com-
   mand is found but is not executable, the return status is 126.

   If a command fails because of an error during expansion or redirection, the exit status is greater than
   zero.

   Shell  builtin  commands  return  a  status of 0 (true) if successful, and non-zero (false) if an error
   occurs while they execute.  All builtins return an exit status of 2 to indicate incorrect usage.

   Bash itself returns the exit status of the last command executed, unless  a  syntax  error  occurs,  in
   which case it exits with a non-zero value.  See also the exit builtin command below.
apbianco
fonte
8

Não tem um significado especial, exceto que o último processo a sair o fez com um status de saída 127.

No entanto, também é usado pelo bash (assumindo que você esteja usando o bash como um shell) para informar que o comando que você tentou executar não pôde ser executado (ou seja, não foi encontrado). Infelizmente, não é imediatamente dedutível, se o processo saiu com o status 127 ou se não foi encontrado.

EDIT:
Não é dedutível imediatamente, exceto pela saída no console, mas isso está excedendo a pilha, então suponho que você esteja fazendo isso em um script.

falstro
fonte
2

Este erro também às vezes engana. Ele diz que o arquivo não foi encontrado, embora os arquivos estejam realmente presentes. Pode ser por causa de caracteres especiais ilegíveis inválidos presentes nos arquivos que podem ser causados ​​pelo editor que você está usando. Esse link pode ajudá-lo nesses casos.

-bash: ./my_script: / bin / bash ^ M: intérprete incorreto: esse arquivo ou diretório não existe

A melhor maneira de descobrir se é esse problema é simplesmente colocar uma instrução de eco no arquivo inteiro e verificar se o mesmo erro foi gerado.

Rama Sastry
fonte
1

Se você estiver tentando executar um programa usando uma linguagem de script, pode ser necessário incluir o caminho completo da linguagem de script e o arquivo a ser executado. Por exemplo:

exec('/usr/local/bin/node /usr/local/lib/node_modules/uglifycss/uglifycss in.css > out.css');
usuario
fonte
Obrigado, isso funcionou para mim. Então, eu fiz o que gs e, em seguida, usei o caminho de saída no meu script. Trabalhou ..
Juan
0

Se a JCL do mainframe IBM tiver alguns caracteres ou números extras no final do nome do script unix que está sendo chamado, poderá gerar esse erro.

Smart Coder
fonte