che cosa significa il trattino `-` prima degli errori` bash` on 'comando non trovato'?


28

Quando si immette un comando non valido al prompt di bash, viene visualizzato il messaggio

-bash: {command}: command not found

Cosa -significa all'inizio?


Come stai esattamente eseguendo il comando? Ho provato a replicare, ma non sto ottenendo gli stessi risultati - ad es.> jhgjbjbkjln: command not found- no -bash: . Stai usando bashin Unix, Linux, OSX, ...? Chiedo perché forse questo è qualcosa che un'implementazione specifica ha messo di default prima del messaggio di errore, e non significa nulla ... forse.
jimm-cl,

@jim Try ssh computernamee il tuo comando non contare per replicare.
Bernhard,

Risposte:


27

Significa che è una shell di login.

Da man bash:

Una shell di login è quella il cui primo carattere dell'argomento zero è un -, oppure uno è iniziato con l'opzione --login.

(Nella bashterminologia, l'argomento "zeroth" è il nome del comando che, nel tuo caso, era bash.) Lo bashutilizza come segnale per eseguire attività di accesso come l'esecuzione .bash_profile, ecc.

Un modo in cui il trattino può essere aggiunto automaticamente è se la shell viene avviata con exec. Dal manuale di Bash :

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

[...] Se l' -lopzione è fornita, la shell posiziona un trattino all'inizio dell'argomento zeroth passato al comando .

Esempio

Confronta questi due tentativi di eseguire il comando nonexistent. Primo senza -l:

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

E, in secondo luogo, con:

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

3
Penso che la parte della documentazione che stai citando non corrisponda alla tua spiegazione. Il fatto che exec -lanteponi un trattino è un modo possibile che può causare l'esecuzione di bash -bash, ma che da solo non dice che si tratta di una shell di accesso e ci sono ottime possibilità che l'OP non abbia usato exec -laffatto . La parte della documentazione che dice che la -bashrende una shell di login è "INVOCATION Una shell di login è quella il cui primo carattere dell'argomento zero è un -, o uno è iniziato con l'opzione --login".
hvd,

@hvd, d'accordo. Sebbene corretta, questa risposta non ha senso.
Stéphane Chazelas,

1
"L'argomento zeroth" non è una bashterminologia, ma una convenzione Unix + indicizzazione C: a ciascun programma viene passato un elenco di parametri, la cui voce iniziale è il nome del programma, seguita dagli argomenti. Poiché le matrici C sono indicizzate a partire da zero, l'argomento zero (ovvero l'argomento zeroth) è il nome del programma e gli argomenti effettivi iniziano con l'indice 1.
celtschk

15

L'altra risposta va bene fino in fondo, ma vale la pena ricordare che la funzionalità è più generale di bash.

Sin dai tempi antichi, il loginprogramma ha anteposto un trattino a argv[0]quando esegue la shell dell'utente e la shell ha riconosciuto questo come un segno che dovrebbe comportarsi come una "shell di accesso". È documentato nelle pagine man di V7 qui: login (1) , sh (1) .

Tutti i programmi che forniscono un servizio simile al login (autenticano un utente ed eseguono una shell) dovrebbero seguire la regola "anteprime trattino". Ad esempio, sshd fa come puoi vedere in ssh / session.c sotto questo commento:

/*
 * 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.
 */

Tutte le shell riconoscono il trattino iniziale. L' -lopzione equivalente non esiste nella classica shell Bourne o nel csh originale, ma la maggior parte delle shell più recenti (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish e qualsiasi versione semi-recente di csh) ce l'hanno.


2
Anche se la maggior parte delle shell ora ha l' -lopzione, loginnon la usa ancora. Ci si aspetta che tutte le shell riconoscano il prefisso argv[0]come meccanismo "ufficiale".
Barmar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.