Estrutura de mensagens de erro no bash

6

As mensagens de erro de Bash às vezes têm um prefixo -bash: ou bash: , às vezes, nenhum.

Considere estas mensagens de erro do Ubuntu 14.04.5 Trusty Tahr com bash 4.3.11 (1)

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found

Em outra pergunta , alguém informa ter visto uma mensagem

-bash: fetch: command not found.

Que não corresponde ao padrão esperado quando "buscar" é simplesmente um programa que não foi instalado.

Após os comentários abaixo, eu tentei usar o bash 3.2.25 (1) no Centos 5.7 - que se comporta de maneira ligeiramente diferente

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
-bash: encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found

Então eu acho que a mensagem da outra pergunta significa exatamente o que eu pensei, antes do meu teste com o bash 4.3.11 me confundir.

Ainda deixa em aberto a questão de se os mantenedores bash pretendiam aplicar algum sistema consistente à estrutura dessas mensagens de texto?

Quando exatamente o bash prefixar mensagens de erro com -bash: e quando com bash: (o que o hífen principal indica?)

Não consegui encontrar respostas usando uma pesquisa simples em man bash , mas talvez haja uma seção que forneça uma explicação?

    
por RedGrittyBrick 27.06.2018 / 12:17

3 respostas

5

When exactly does bash prefix error messages with -bash: and when with bash:

O prefixo, se impresso, é geralmente o nome com o qual o bash foi iniciado, também conhecido como argv[0] ( geralmente disponível em $0 ).

$ bash -c 'type foo; echo $0'
bash: line 0: type: foo: not found
bash
$ ARGV0=bar bash -c 'type foo; echo $0'
bar: line 0: type: foo: not found
bar
$ ARGV0='¯\(°_o)/¯' bash -c 'type foo; echo $0'
¯\(°_o)/¯: line 0: type: foo: not found
¯\(°_o)/¯

(Isso usa a variável especial ARGV0 do zsh para definir argv[0] de um comando para o que quisermos.)

Para iniciar o bash como um shell de login, o que quer que inicie o bash pode prefixar argv[0] com - ou usar a opção -l . Consulte Como invocar o Bash :

A login shell is one whose first character of argument zero is ‘-’, or one invoked with the --login option.

Então, por exemplo,

$ ARGV0=-bash bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
-bash:login
$ bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
bash:not login

SSH, sudo (com -i ), o comando TTY login , etc. geralmente usam o método - inicial para iniciar um shell de login. Portanto, se você fez login por meio de qualquer um desses, provavelmente verá -bash (ou -zsh , ou -tcsh , ou qualquer que seja seu login com - na frente). Se você começou o bash através de um emulador de terminal, eles normalmente executam shells que não são de login e você veria bash .

what does the leading hyphen indicate?

Esse provavelmente é um shell de login, que pode ser um ponto útil na depuração. Em particular, PATH é frequentemente definido a partir de arquivos originados por shells de login ( /etc/profile , ~/.profile , ~/.bash_profile , etc. - veja Bash Startup Files para mais). Para um erro de comando não encontrado, isso seria particularmente importante, pois PATH é como os comandos são encontrados. Ele fornece informações úteis sobre quais arquivos devem ser verificados para modificar PATH .

    
por 02.07.2018 / 09:04
2

When exactly does bash prefix error messages with -bash: and when with bash:

É arbitrário.

what does the leading hyphen indicate?

Nada de útil . Veja a resposta do muru que indica que o hífen indica que a mensagem de erro está sendo reportada por um login shell .

Manual de bash

O manual para Bash do GNU menciona uma opção de shell

gnu_errfmt

    If set, shell error messages are written in the standard GNU error message format.

Eu tentei defini-lo, os resultados da pergunta não foram alterados.

Padrões de codificação GNU

Os Padrões de Codificação GNU parecem preocupados principalmente com mensagens de erro de compiladores (por exemplo, gcc ?) no entanto, a seção 4.4 diz

4.4 Formatting Error Messages

...

... like this:

    program: message

when there is no relevant source file.  

GNU libc

O manual da libc do GNU dá este exemplo para produzir mensagens de erro.

fprintf (stderr, "%s: Couldn't open file %s; %s\n",
               program_invocation_short_name, name, strerror (errno));
      exit (EXIT_FAILURE);

A partir da falta de detalhes na documentação acima e da variação vista na questão, deduzo que não existe um significado específico pretendido pela presença ou ausência do prefixo bash: .

    
por 28.06.2018 / 11:58
0

Para adicionar à resposta do muru , a maneira canônica de definir argv[0] para sh -c ou bash -c é fornecer uma cadeia após a cadeia de comandos. Então, por exemplo,

$ sh -c '"$@"' mush date +'%B %e'
July  7

$ sh -c '"$@"' mush fig  +'%B %e'
mush: fig: command not found

$ sh -c '"$@"' mush type fig
mush: line 0: type: fig: not found

Relacionados:

por 08.07.2018 / 05:53

Tags