o que significam os erros do traço `-` antes de` bash` on 'not found'?

28

Ao inserir um comando inválido em um prompt do bash, você recebe a mensagem

-bash: {command}: command not found

O que significa -no início?

Evan Purkhiser
fonte
Como exatamente você está executando o comando? Tentei replicar, mas não estou obtendo os mesmos resultados - por exemplo, jhgjbjbkjln: command not found- não -bash: existem lá. Você está usando bashno Unix, Linux, OSX, ...? Eu pergunto porque talvez isso seja algo que uma implementação específica coloque antes da mensagem de erro por padrão, e isso não significa nada ... talvez.
jimm-cl
@ jim Tente ssh computernamee seu comando não conte para replicar.
Bernhard

Respostas:

27

Isso significa que é um shell de login.

De man bash:

Um shell de logon é aquele cujo primeiro caractere do argumento zero é um - ou iniciado com a opção --login.

(Na bashterminologia, o argumento "zeroth" é o nome do comando que, no seu caso, era bash.) bashUsa isso como um sinal para realizar atividades de login, como execução .bash_profileetc.

Uma maneira pela qual o traço pode ser adicionado automaticamente é se o shell for iniciado exec. No manual do Bash :

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

[...] Se a -lopção for fornecida, o shell coloca um traço no início do argumento zeroth passado ao comando .

Exemplo

Compare essas duas tentativas para 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
John1024
fonte
3
Acho que a parte da documentação que você está citando não corresponde à sua explicação. O fato de que exec -lprepends um traço é uma maneira possível que pode causar bash para ser executado como -bash, mas isso por si só não dizer que é um shell de login, e há uma boa chance de que o OP não tem usado exec -lem tudo . A parte da documentação que diz que o -bashtorna um shell de logon é "INVOCAÇÃO Um shell de logon é aquele cujo primeiro caractere do argumento zero é um - ou iniciado com a opção --login".
hvd
@hvd, concordou. Embora correta, essa resposta erra o ponto.
Stéphane Chazelas
1
"O argumento zeroth" não é bashterminologia, mas convenção do Unix + indexação C: Cada programa recebe uma lista de parâmetros, cuja entrada inicial é o nome do programa, seguida pelos argumentos. Desde matrizes C são indexadas começando com zero, argumento zero (ou seja, o argumento zeroth) é o nome do programa, e os argumentos reais começar com o índice 1.
celtschk
15

A outra resposta é boa no que diz respeito, mas vale a pena mencionar que o recurso é mais geral que o bash.

Desde os tempos antigos, o loginprograma precedeu um traço para argv[0]quando ele executa 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 da V7 aqui: login (1) , sh (1) .

Todos os programas que fornecem um serviço semelhante ao login (autenticar um usuário e executar um shell) devem seguir a regra "pré-traço". 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.
 */

Todas as conchas reconhecem o traço principal. A -lopção equivalente não existe no shell Bourne clássico ou no csh original, mas a maioria dos shells mais recentes (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish e qualquer versão semi-recente do csh) o possui.

Stéphane Chazelas
fonte
2
Mesmo que a maioria das conchas agora tenha a -lopção, loginainda não a utiliza. Espera-se que todos os shells reconheçam o prefixo argv[0]como o mecanismo "oficial".
Barmar