o que significa o traço '-' antes de 'bash' em 'comando não encontrado' significa erros?

27

Quando você insere um comando inválido em um prompt bash, recebe a mensagem

-bash: {command}: command not found

O que significa - no início?

    
por Evan Purkhiser 08.08.2014 / 07:30

2 respostas

26

Isso significa que é um shell de login.

De man bash :

A login shell is one whose first character of argument zero is a -, or one started with the --login option.

(Na terminologia bash , o argumento "zeroth" é o nome do comando que, no seu caso, foi bash .) bash usa isso como um sinal para executar atividades de login, como executar .bash_profile , etc.

Uma maneira que o traço pode ser adicionado automaticamente é se o shell é iniciado com exec . Do manual de Bash :

exec [-cl] [-a name] [command [arguments]]

[...] If the -l option is supplied, the shell places a dash at the beginning of the zeroth argument passed to command.

Exemplo

Compare essas duas tentativas de executar o comando nonexistent . Primeiro sem -l :

$ exec bash
$ nonexistent
bash: nonexistent: command not found

E, segundo, com:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
    
por 08.08.2014 / 07:45
14

A outra resposta está bem, mas vale a pena mencionar que o recurso é mais geral que o bash.

Desde os tempos antigos, o programa login prefixou um traço para argv[0] quando executou o shell do usuário, e o shell reconheceu isso como um sinal de que deveria se comportar como um "shell de login". Está documentado nas páginas de manual do V7 aqui: login (1) , sh (1) .

Todos os programas que fornecem um serviço de login (autenticar um usuário e executar um shell) devem seguir a regra "prepend dash". Por exemplo, o sshd faz como você pode ver em ssh / session.c sob este comentário:

/*
 * If we have no command, execute the shell.  In this case, the shell
 * name to be passed in argv[0] is preceded by '-' to indicate that
 * this is a login shell.
 */

Todos os shells reconhecem o traço principal. A opção -l equivalente não existe no shell Bourne clássico ou no csh original, mas na maioria dos shells mais recentes (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish e qualquer versão semi-recente do csh) tê-lo.

    
por 08.08.2014 / 14:24

Tags