Программа выполняет это:
close(0);
Дескриптор стандартного входного файла не изменил значение,но он больше не ссылается на описание открытого файла. Он доступен для перераспределения -. Последующие попытки использовать его, скажем, в read()
приведут к EBADF
, потому что хотя это все еще дескриптор файла, он не является выделенным, ссылающимся на открытое описание файла. Это плохой файловый дескриптор.
ls
обрабатывает эти настройки как строки для отправки на терминал. Оно не знает, что они означают. Он отправляет строкуESC [ m
;
на терминал, и терминал должен интерпретировать эту управляющую последовательность.
Стандартом де-факто для терминальных escape-последовательностей является xterm . В этом документе CSI
означает ESC [
, Ps — целое число, а Pm — список целых чисел, разделенных точкой с запятой -, поэтому соответствующая управляющая последовательность указана в разделе CSI Pm m
.
Терминал применяет параметры по порядку. Параметр 0 сбрасывает все атрибуты, включая цвет. Таким образом, 91;00
эквивалентно 0
, используйте 91
вместо (или 0;91
, если вы хотите сбросить все атрибуты, затем установите цвет переднего плана ). 91;01
эквивалентно 01;91
, поскольку цвет переднего плана и интенсивность являются независимыми атрибутами.
ls
обычно начинается с атрибутов по умолчанию и в любом случае сбрасывается на атрибуты по умолчанию в конце каждого цветного имени, поэтому 00;
в этих настройках является избыточным.