Во-первых, важно отметить, что не только поведение пользовательской программы не определено, но и поведение компилятора не определено. Аналогично, UB не встречается во время выполнения, это свойство исходного кода.
Чтобы писатель-компилятор «поведение не определено» означает «вам не нужно учитывать эту ситуацию», , или даже «вы не можете предположить, что исходный код никогда не произведет такую ситуацию». Компилятор может делать что угодно, преднамеренно или непреднамеренно, когда представлен UB, и по-прежнему является стандартным, поэтому да, если вы предоставили доступ к носу ...
Тогда не всегда возможно знать если программа имеет UB или нет. Пример:
int * ptr = calculateAddress();
int i = *ptr;
Зная, может ли это быть UB или нет, потребуется знание всех возможных значений, возвращаемых calculateAddress()
, что невозможно в общем случае (см. « Проблема с остановкой "). У компилятора есть два варианта:
ptr
всегда будет действительный адрес Первый вариант создает быстрые программы и ставит бремя избежать нежелательных эффектов на программиста, тогда как второй вариант обеспечивает более безопасный, но более медленный код.
Стандарты C и C ++ оставляют этот выбор открытым, и большинство компиляторы выбирают первый, в то время как Java, например, задает второй.
Почему поведение не определено реализацией, но неопределено?
Реализация -определенные средства ( N4296 , 1.9§2):
Некоторые аспекты и операции абстрактной машины описаны в этом Международном стандарте в качестве реализации (например, sizeof (int)). Они составляют параметры абстрактной машины. Каждая реализация должна включать документацию, описывающую ее характеристики и поведение в этих отношениях. Такая документация должна определять экземпляр абстрактной машины, которая соответствует этой реализации (упоминается как «соответствующий экземпляр» ниже).
blockquote>Акцент мой. Другими словами: компилятор-писатель должен точно документировать , как ведет себя машинный код, когда исходный код использует определенные для реализации функции.
Запись на случайный ненулевой Недопустимый указатель - одна из самых непредсказуемых вещей, которые вы можете сделать в программе, поэтому для этого потребуется также сократить время выполнения. До того, как у нас были MMU, вы могли бы уничтожить аппаратное обеспечение , написав неверный адрес, который приходит очень рядом с носовыми демонами; -)
Вот пример того, как установить красную подсказку:
PS1=$'\e[0;31m$ \e[0m'
Волшебство \e[0;31m
(включите красный передний план), и \e[0m
(выключите атрибуты символов). Их называют escape-последовательностями. Различные escape-последовательности дают Вам различные результаты, от абсолютного расположения курсора, для окраски, к способности изменить строку заголовка окна, и так далее.
Для больше на escape-последовательностях, см. статью в Википедии об управляющих кодах ANSI
Ответ Bryan Oakley выше имеет незначительный сбой, как на него уже указали и решение, предлагаемое Andrew Marshall, хотя он не несет незначительный сбой, тем не менее, он не делает это очевидным для слишком большой настройки на цветах используемый.
, Поскольку macOS Catalina просит zsh быть оболочкой по умолчанию с этого времени, я думаю, что еще несколько людей могут хотеть настроить свою подсказку и могли бы приезжать сюда для ответа. Так, я думал, что попытаюсь дать более широкую сводку и затронуть из других очень тесно связанных соображений, которые позволяют больше настройки.
3-разрядные Коды для Различных Цветов. , В первую очередь, здесь мы можем найти 3-разрядные коды для различных цветов: https://unix.stackexchange.com/a/124409/194343. Например, 214 некоторый оранжевый цвет.
Передний план и Фон. другая ключевая информация - то, что для [1 124] Foreground и баккара K грунт можно определить то, что они хотят с [1 126] F и K соответственно. Источник является zsh руководством по визуальным эффектам: http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html#Visual-effects
Так, например, следующие две команды
autoload -U colors && colors
export PS1="%F{214}%K{000}%m%F{015}%K{000}:%F{039}%K{000}%~%F{015}%K{000}\$ "
представляют имя узла в оранжевом с черным фоном, сопровождаемым двоеточием в белом с черным фоном, сопровождаемым текущим рабочим каталогом в ярком, синем с черным фоном, сопровождаемым знаком доллара в белом с черным фоном.
[еще 1118] сопутствующая информация найдена ниже.
Быстрая информация на правой стороне. , Например, добавляя метку времени. См. https://superuser.com/a/1251045/290299. Конечно, на это можно нанести цветную маркировку, например, с некоторым голубым/purple-ish окрашивают, как это:
RPROMPT="%F{111}%K{000}[%D{%f/%m/%y}|%@]"
Цвета для ls
. После чтения руководства для ls, например, можно активировать цвета для ls
использование следующих двух команд:
export CLICOLOR=1
export LSCOLORS=gafacadabaegedabagacad
Наконец, как последний комментарий, что я не протестировал, поскольку я доволен своей конфигурацией, другая авеню могла бы быть, чтобы кто-то установил порт coreutils
от [1 110] MacPorts, и затем используйте gdircolors
(источник: https://unix.stackexchange.com/a/174596/194343). (Я могу отредактировать эту последнюю часть в будущем, поскольку все вышеупомянутое является связанными частями, которые делают повседневную жизнь намного большим количеством забавы и легче справиться.)
Поместите это в ~ / .zshrc
:
autoload -U colors && colors
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "
Поддерживаемые цвета:
красный
, синий
, зеленый
, голубой
, желтый
, пурпурный
, черный
и белый
(из этот ответ ), хотя на разных компьютерах могут быть разные допустимые параметры.
Окружайте цветовые коды (и любые другие непечатаемые символы) с помощью % {....%}
. Это необходимо для правильной работы переноса текста.
Кроме того, вот как вы можете заставить это работать с обрезкой каталогов из здесь .
PS1="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%(5~|%-1~/.../%3~|%4~) %{$reset_color%}%% "