что означает тире `-` до ошибок` bash` on 'command not found'?

28

Когда вы вводите неверную команду в приглашении bash, вы получаете сообщение

-bash: {command}: command not found

Что означает -в самом начале?

Эван Пурхизер
источник
Как именно вы выполняете команду? Я пытался повторить, но я не получаю те же результаты - например> jhgjbjbkjln: command not found- нет -bash: там. Вы используете bashв Unix, Linux, OSX, ...? Я спрашиваю, потому что, может быть, это какая-то конкретная реализация, поставленная перед сообщением об ошибке по умолчанию, и это ничего не значит ... может быть.
jimm-cl
@jim Попробуйте, ssh computernameи ваша команда не рассчитывать на репликацию.
Бернхард

Ответы:

27

Это означает, что это оболочка входа в систему.

От man bash:

Оболочка входа - это та, чей первый символ аргумента ноль - -, или тот, который начинается с опции --login.

bashтерминологии аргумент «ноль» - это имя команды, которое, в вашем случае, было bash.) bashИспользует это в качестве сигнала для выполнения действий входа в систему, таких как выполнение .bash_profileи т. Д.

Одним из способов автоматического добавления дефиса является запуск оболочки exec. Из руководства Bash :

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

[...] Если -lопция указана, оболочка помещает тире в начало нулевого аргумента, передаваемого команде .

пример

Сравните эти две попытки запустить команду nonexistent. Сначала без -l:

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

И, во-вторых, с:

$ exec -l bash
$ nonexistent
-bash: nonexistent: command not found
John1024
источник
3
Я думаю, что часть документации, которую вы цитируете, не соответствует вашему объяснению. Тот факт , что exec -lприсоединяет прочерк возможный путь , который может привести к баш будет работать как -bash, но это само по себе не говорит , что это Войти оболочка, и есть очень хороший шанс , что ОП не используется exec -lвообще , Часть документации, которая гласит, -bashделает это оболочкой входа в систему: «ПРИЗНАНИЕ. Оболочка входа в систему - это оболочка, в которой первый символ нулевого аргумента - -, или тот, который начинается с опции --login».
HVd
@hvd, согласился. Несмотря на правильность, этот ответ не имеет смысла.
Стефан Шазелас
1
«Нулевой аргумент» - это не bashтерминология, а соглашение Unix + индексирование C: каждой программе передается список параметров, исходная запись которого - имя программы, за которой следуют аргументы. Поскольку массивы C индексируются, начиная с нуля, аргумент ноль (то есть нулевой аргумент) - это имя программы, а фактические аргументы начинаются с индекса 1.
celtschk
15

Другой ответ вполне подходит, но стоит упомянуть, что эта функция является более общей, чем bash.

С древних времен loginпрограмма добавляла тире к argv[0]выполнению пользовательской оболочки, и оболочка распознала это как знак того, что она должна вести себя как «оболочка входа в систему». Это задокументировано в справочных страницах V7 здесь: login (1) , sh (1) .

Все программы, предоставляющие службу входа в систему (аутентификацию пользователя и запуск оболочки), должны следовать правилу «prepend dash». Например, sshd делает то, что вы можете видеть в ssh / session.c под этим комментарием:

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

Все снаряды распознают ведущую черту. Эквивалентной -lопции не существует в классической оболочке Bourne или в оригинальном csh, но большинство новых оболочек (bash, dash, ksh, yash, tcsh, zsh, rc, es, fish и в любой недавней версии csh) имеют ее.

Стефан Шазелас
источник
2
Хотя у большинства оболочек теперь есть -lопция, она loginвсе равно не используется. Ожидается, что все оболочки распознают префикс argv[0]как «официальный» механизм.
Бармар