Mensagens de erro diferentes ao usar strings diferentes no terminal

2

Quando insiro, por exemplo, unix.stackexchange.com seguido de Enter no terminal, recebo o seguinte erro:

unix.stackexchange.com: command not found

Está tudo bem e como eu esperava. Mas quando insiro http://unix.stackexchange.com , recebo outra mensagem de erro:

bash: http://unix.stackexchange.com: No such file or directory

Eu não pergunto por que recebo erros. Eu quero saber por que eles são diferentes e, eventualmente, qual processo / função lida com eles?

    
por Radu Rădeanu 25.10.2013 / 08:21

2 respostas

2

Como também ewhac apontou , o erro as mensagens diferem porque a última linha de comando contém barras ( / ), o que faz com que o seu shell interprete como um caminho de arquivo.

Ambos os erros são originários do seu shell, que neste caso é bash (o que é evidente a partir da segunda mensagem de erro).

Mais especificamente, o primeiro erro se origina da função execute_disk_command() definida em execute_command.c no bash-4.2 código-fonte. A função execute_disk_command() chama search_for_command() definido em findcmd.c , que, caso o pathname especificado não contenha barras, pesquisa $PATH para o pathname . No caso de pathname conter barras, search_for_command() não executa essa pesquisa. Caso search_for_command() não retorne um comando, execute_disk_command() falhará com o erro interno command not found .

O segundo erro se origina da função shell_execve() , também definida em execute_command.c . Neste ponto do seu cenário, search_for_command() teria retornado com êxito porque não teria sido necessária nenhuma pesquisa e execute_disk_command() chamou shell_execve() , que, por sua vez, executa a chamada de sistema execve() . Isso falha, porque o arquivo execve() tenta executar não existe e execve() indica isso configurando errno apropriadamente. Quando execve() falha, shell_execve() usa strerror() para relatar a mensagem de erro do arquivo correspondente ( No such file or directory ) e sai do shell imediatamente no erro.

    
por 25.10.2013 / 10:05
2

O caractere / é um separador de nome de caminho. Portanto, o shell supõe que você esteja especificando um caminho relativo para um comando denominado unix.stackexchange.com em um diretório denominado http: . O shell não consegue encontrar o diretório ou o arquivo e diz isso. Você receberia a mesma mensagem de erro se tentasse executar um comando chamado (por exemplo): foo/bar/grill/snorklewacker .

Por outro lado, se você digitar um nome de comando simples sem separador de nome de caminho, o shell verificará a lista de diretórios na variável de ambiente PATH , na ordem em que aparecem, para ver se eles contêm o programa. Assim, se você fosse digitar unix.stackexchange.com em um prompt no meu sistema, o shell conduziria uma pesquisa procurando:

  • /usr/local/bin/unix.stackexchange.com
  • /usr/bin/unix.stackexchange.com
  • /bin/unix.stackexchange.com
  • /usr/local/games/unix.stackexchange.com
  • /usr/games/unix.stackexchange.com

Se todas essas pesquisas falharem, você receberá o erro command not found .

    
por 25.10.2013 / 08:45