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
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.
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".
jhgjbjbkjln: command not found
- não-bash:
existem lá. Você está usandobash
no 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.ssh computername
e seu comando não conte para replicar.Respostas:
Isso significa que é um shell de login.
De
man bash
:(Na
bash
terminologia, o argumento "zeroth" é o nome do comando que, no seu caso, erabash
.)bash
Usa isso como um sinal para realizar atividades de login, como execução.bash_profile
etc.Uma maneira pela qual o traço pode ser adicionado automaticamente é se o shell for iniciado
exec
. No manual do Bash :Exemplo
Compare essas duas tentativas para executar o comando
nonexistent
. Primeiro sem-l
:E, segundo, com:
fonte
exec -l
prepends 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 usadoexec -l
em tudo . A parte da documentação que diz que o-bash
torna 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".bash
terminologia, 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.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
login
programa precedeu um traço paraargv[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:
Todas as conchas reconhecem o traço principal. A
-l
opçã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.fonte
-l
opção,login
ainda não a utiliza. Espera-se que todos os shells reconheçam o prefixoargv[0]
como o mecanismo "oficial".