6

Сообщения об ошибках Bash иногда имеют префикс -bash: или bash: иногда нет.

Рассмотрим эти сообщения об ошибках от Ubuntu 14.04.5 Trusty Tahr с bash 4.3.11(1)

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found

В другом вопросе кто-то сообщает, что видел сообщение

-bash: fetch: command not found.

Что не соответствует шаблону, ожидаемому, когда "fetch" - это просто программа, которая не была установлена.


После комментариев ниже я попытался использовать bash 3.2.25(1) на Centos 5.7 - который ведет себя немного иначе

$ type encabulator
-bash: type: encabulator: not found

$ encabulator
-bash: encabulator: command not found

$ bash -c encabulator
bash: encabulator: command not found

Поэтому я думаю, что сообщение из другого вопроса означает именно то, что я сначала подумал, до того, как мой тест с bash 4.3.11 смутил меня.

Это все еще оставляет открытым вопрос о том, намеревались ли разработчики bash применить некоторую непротиворечивую систему к структуре этих текстовых сообщений?


Когда именно выдается сообщение об ошибке префикса bash с -bash: и когда с bash: (что указывает начальный дефис?)

Я не мог найти ответы, используя простой поиск в man bash но, может быть, есть раздел, который дает объяснение?

3 ответа3

5

Когда именно это происходит с сообщениями об ошибках префикса bash с -bash: и когда с bash:

Префикс, если он напечатан, обычно представляет собой имя, с которого был запущен bash, он же argv[0] (обычно доступен в $0).

$ bash -c 'type foo; echo $0'
bash: line 0: type: foo: not found
bash
$ ARGV0=bar bash -c 'type foo; echo $0'
bar: line 0: type: foo: not found
bar
$ ARGV0='¯\(°_o)/¯' bash -c 'type foo; echo $0'
¯\(°_o)/¯: line 0: type: foo: not found
¯\(°_o)/¯

(При этом используется специальная переменная zsh ARGV0 для установки argv[0] команды в любое положение.)

Для запуска bash в качестве оболочки входа в систему все, что запускается bash, может иметь префикс argv[0] с - или использовать опцию -l . Смотрите Invoking Bash:

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

Так, например,

$ ARGV0=-bash bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
-bash:login
$ bash -c 'echo -n $0:;shopt -q login_shell && echo login || echo not login'
bash:not login

SSH, sudo-i), команда login TTY и т.д. Обычно используют начальный метод - для запуска оболочки входа в систему. Итак, если вы вошли в систему с помощью любого из них, вы , вероятно , чтобы увидеть -bash (или -zsh или -tcsh или как бы вы войти в оболочку есть с - перед ним). Если вы запустили bash через эмулятор терминала, они обычно запускают оболочки без входа в систему, и вы увидите bash .


на что указывает ведущий дефис?

Что это, вероятно, оболочка входа в систему, которая может быть полезным пунктом при отладке. В частности, PATH часто устанавливается из файлов, получаемых из оболочек входа в систему (/etc/profile , ~/.profile , ~/.bash_profile и т.д. - см. Bash Startup Files для получения дополнительной информации). Для ошибки «команда не найдена» это будет особенно важно, поскольку PATH - это способ поиска команд. Это дает вам полезную информацию о том, какие файлы должны быть проверены на предмет изменения PATH .

2

Когда именно это происходит с сообщениями об ошибках префикса bash с -bash: и когда с bash:

Это произвольно.

на что указывает ведущий дефис?

Ничего полезного. Посмотрите ответ Муру, который указывает, что дефис указывает, что сообщение об ошибке сообщается оболочкой входа в систему.


Руководство по Bash

В руководстве по GNU для Bash упоминается опция оболочки

gnu_errfmt

    If set, shell error messages are written in the standard GNU error message format.

Я попытался установить его, результаты в вопросе остались без изменений.

Стандарты кодирования GNU

Стандарты кодирования GNU в основном касаются сообщений об ошибках от компиляторов (т. gcc?) однако в разделе 4.4 говорится

4.4 Formatting Error Messages

...

... like this:

    program: message

when there is no relevant source file.  

GNU libc

В руководстве GNU по libc приведен пример создания сообщений об ошибках.

fprintf (stderr, "%s: Couldn't open file %s; %s\n",
               program_invocation_short_name, name, strerror (errno));
      exit (EXIT_FAILURE);

Из-за недостатка деталей в вышеприведенной документации и из-за различий в этом вопросе я заключаю, что нет никакого конкретного значения, подразумеваемого наличием или отсутствием префикса bash: .

0

Чтобы добавить к ответу muru, канонический способ установки argv[0] для sh -c или bash -c - предоставить строку после командной строки.  Так, например,

$ sh -c '"$@"' mush date +'%B %e'
July  7

$ sh -c '"$@"' mush fig  +'%B %e'
mush: fig: command not found

$ sh -c '"$@"' mush type fig
mush: line 0: type: fig: not found

Связанные с:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .