GNU Coreutils
GNU Coreutils — это пакет программного обеспечения для операционных систем семейства Unix, содержащий базовые утилиты командной строки, такие как cat, ls, cp, mv, rm, mkdir, sort, head, tail, wc и другие. Разрабатывается в рамках проекта GNU и является стандартным компонентом большинства дистрибутивов Linux, а также может использоваться в других Unix-подобных системах, включая BSD и macOS (через пакетные менеджеры). Пакет объединяет три ранее существовавших набора утилит: textutils, shellutils и fileutils, предоставляя единый интерфейс и поведение.
История
Предшественники
До появления GNU Coreutils в Unix-подобных системах существовал набор утилит, поставляемый с оригинальной операционной системой Unix, разработанной в Bell Labs (AT&T). Эти утилиты, созданные в 1970-х годах, включали такие команды, как ls, cp, mv, rm, cat, sort, wc и другие. Они были написаны на языке Си и распространялись вместе с исходными кодами Unix. Однако с развитием проекта GNU (GNU’s Not Unix), начатого Ричардом Столлманом в 1983 году, возникла необходимость в создании свободных (свободных от лицензионных ограничений) аналогов этих утилит.
Разработка в рамках проекта GNU
Проект GNU начал разработку собственных версий утилит в середине 1980-х годов. Первоначально они разрабатывались как отдельные пакеты:
- fileutils — утилиты для работы с файлами (например,
cp,mv,rm,ls,mkdir,rmdir,chmod,chown,ln,touch,df,du,dd). - textutils — утилиты для обработки текста (например,
cat,sort,head,tail,wc,tr,cut,paste,join,uniq,fmt,pr,fold). - shellutils — утилиты для работы с оболочкой и системой (например,
echo,false,true,test,expr,sleep,who,users,id,logname,uname,hostname,env,printenv,nice,nohup,tty,basename,dirname,pathchk).
Эти пакеты разрабатывались разными авторами и имели различные версии. В 1990-х годах, с ростом объёма кода и необходимостью унификации, было принято решение объединить их в один пакет.
Создание Coreutils
Пакет GNU Coreutils был создан в 2002 году путём слияния трёх вышеупомянутых пакетов. Первая версия (5.0) вышла 4 апреля 2003 года. Основными целями объединения были:
- Упрощение процесса сборки и распространения (один тарбол вместо трёх).
- Унификация поведения утилит (например, единые опции командной строки, единые сообщения об ошибках).
- Улучшение переносимости и поддержки стандартов POSIX.
Разработчиками Coreutils являются члены сообщества GNU, в том числе Джим Мейеринг (Jim Meyering), который долгое время был основным мейнтейнером, и Пол Эггерт (Paul Eggert). Пакет распространяется под лицензией GPLv3+ (GNU General Public License версии 3 или более поздней).
Состав и классификация
Пакет GNU Coreutils включает в себя более 100 утилит. Их можно условно разделить на несколько категорий по функциональному назначению:
Утилиты для работы с файлами
cat— объединение и вывод содержимого файлов.cp— копирование файлов и каталогов.mv— перемещение или переименование файлов и каталогов.rm— удаление файлов и каталогов.mkdir— создание каталогов.rmdir— удаление пустых каталогов.ln— создание жёстких и символических ссылок.chmod— изменение прав доступа к файлам.chown— изменение владельца и группы файлов.chgrp— изменение группы файлов.touch— обновление времени доступа и модификации файла или создание пустого файла.dd— преобразование и копирование файлов с заданными параметрами (например, размер блока).df— отображение информации о свободном месте на файловых системах.du— оценка использования дискового пространства файлами и каталогами.ls— вывод списка файлов и каталогов.stat— вывод подробной информации о файле (inode, права, время и т.д.).truncate— усечение или расширение файла до заданного размера.realpath— преобразование относительного пути в абсолютный.basename— выделение имени файла из пути.dirname— выделение имени каталога из пути.
Утилиты для обработки текста
cat(также относится к файловым) — вывод содержимого.sort— сортировка строк в файлах или входном потоке.head— вывод первых N строк файла.tail— вывод последних N строк файла.wc— подсчёт количества строк, слов и символов.tr— преобразование или удаление символов.cut— извлечение полей из строк.paste— объединение строк из нескольких файлов.join— объединение строк из двух файлов по общему полю.uniq— удаление повторяющихся строк.fmt— форматирование текста (перенос строк).pr— форматирование текста для печати (разбивка на страницы).fold— разбивка длинных строк на несколько.expand— замена символов табуляции на пробелы.unexpand— замена пробелов на символы табуляции.nl— нумерация строк.od— дамп файла в восьмеричном или другом формате.sum— вычисление контрольной суммы и количества блоков.cksum— вычисление контрольной суммы CRC и количества байт.
Утилиты для работы с оболочкой и системой
echo— вывод строки в стандартный вывод.false— завершение с кодом ошибки (1).true— завершение с кодом успеха (0).test— проверка условий (например, существование файла, сравнение чисел).expr— вычисление арифметических выражений.sleep— приостановка выполнения на заданное количество времени.who— вывод списка пользователей, вошедших в систему.users— вывод имён пользователей, вошедших в систему.id— вывод информации о текущем пользователе (UID, GID, группы).logname— вывод имени пользователя, под которым выполнен вход.uname— вывод информации о системе (имя ядра, версия, архитектура).hostname— вывод или установка имени хоста.env— вывод или изменение переменных окружения.printenv— вывод значений переменных окружения.nice— запуск программы с изменённым приоритетом.nohup— запуск программы, игнорирующей сигнал SIGHUP.tty— вывод имени терминала, подключённого к стандартному вводу.basenameиdirname(также относятся к файловым).pathchk— проверка корректности имени пути.seq— вывод последовательности чисел.yes— многократный вывод строки (по умолчанию «y»).
Утилиты для работы с датой и временем
date— вывод или установка системной даты и времени.cal— вывод календаря на месяц или год.nproc— вывод количества доступных процессоров.
Утилиты для работы с пользователями и группами
whoami— вывод имени текущего пользователя (аналогid -un).groups— вывод групп, в которые входит пользователь.users(см. выше).id(см. выше).
Утилиты для работы с процессами
kill— отправка сигнала процессу.nohup(см. выше).nice(см. выше).
Особенности и поведение
Стандартизация
GNU Coreutils стремится соответствовать стандарту POSIX (Portable Operating System Interface), но также включает множество расширений, не входящих в POSIX. Например, многие утилиты поддерживают длинные опции (например, --help, --version, --verbose), которые не являются частью стандарта. Также Coreutils часто реализует поведение, отличное от оригинальных утилит Unix, что может вызывать несовместимость при переносе скриптов между системами.
Опции командной строки
Утилиты Coreutils поддерживают стандартные соглашения GNU:
- Короткие опции — однобуквенные с одним дефисом (например,
-lдляls). - Длинные опции — многосимвольные с двумя дефисами (например,
--allдляls). - Комбинирование коротких опций — например,
ls -laэквивалентноls -l -a. - Опция
--help— вывод справки по использованию. - Опция
--version— вывод информации о версии.
Обработка ошибок
Утилиты Coreutils выводят сообщения об ошибках в стандартный поток ошибок (stderr) и завершаются с ненулевым кодом возврата в случае ошибки. Сообщения об ошибках обычно содержат имя утилиты, причину ошибки и имя файла (если применимо).
Локализация
Coreutils поддерживает локализацию (интернационализацию) через систему gettext. Сообщения об ошибках, справка и другие тексты могут быть переведены на различные языки, включая русский. Для выбора локали используются переменные окружения LANG, LC_ALL, LC_MESSAGES.
Применение
GNU Coreutils является фундаментальным компонентом любой Unix-подобной операционной системы. Он используется:
- В повседневной работе системных администраторов — для управления файлами, пользователями, процессами, дисковым пространством.
- В скриптах оболочки (bash, sh, zsh) — для автоматизации задач, таких как резервное копирование, обработка логов, мониторинг системы.
- В качестве строительных блоков для более сложных программ — многие утилиты (например,
sort,uniq,cut) используются в конвейерах (pipes) для обработки данных. - В образовательных целях — для изучения основ Unix-подобных систем и командной строки.
Критика и альтернативы
Критика
- Размер и сложность — пакет Coreutils включает множество утилит, каждая из которых имеет множество опций. Это может быть избыточно для встраиваемых систем или минимальных окружений (например, контейнеров Docker).
- Несовместимость с оригинальным Unix — поведение некоторых утилит (например,
lsс опцией--color,cpс опцией--preserve) отличается от традиционных версий, что может приводить к ошибкам при переносе скриптов. - Производительность — для некоторых задач (например, сортировка больших файлов) Coreutils может быть медленнее специализированных инструментов (например,
sortиз GNU Coreutils для больших данных может быть медленнее, чемsortиз других реализаций).
Альтернативы
- BusyBox — набор утилит, объединённых в один исполняемый файл, предназначенный для встраиваемых систем и минимальных окружений. BusyBox реализует большинство утилит Coreutils, но с меньшим количеством опций и меньшим размером.
- Toybox — аналогичный проект, разрабатываемый с фокусом на простоту и переносимость.
- uutils (coreutils) — реализация Coreutils на языке Rust, стремящаяся к полной совместимости с GNU Coreutils, но с улучшенной производительностью и безопасностью.
- Heirloom Toolchest — набор утилит, воспроизводящих поведение оригинальных утилит Unix из 1970-х годов.
Интересные факты
- В состав Coreutils входит утилита
yes, которая бесконечно выводит строку «y» (или любую другую, заданную пользователем). Она может использоваться для автоматического подтверждения действий в скриптах. - Утилита
dd(data duplicator) имеет нестандартный синтаксис опций (например,if=файл,of=файл,bs=размер), который отличается от других утилит Coreutils. Это связано с её историческим происхождением из IBM OS/360. - Утилита
seqбыла добавлена в Coreutils относительно поздно (в версии 4.0, 2003 год) и заменила собой более старые реализации, такие какseqиз пакетаutil-linux. - В Coreutils есть утилита
shuf, которая генерирует случайные перестановки строк из входного файла или потока. Она была добавлена в версии 6.0 (2006 год). - Утилита
timeoutпозволяет запускать команду с ограничением по времени. Если команда не завершается за указанное время, она получает сигнал SIGTERM (или другой, заданный пользователем).
Источники
- GNU Coreutils Manual (Free Software Foundation)
- POSIX.1-2017 Standard (IEEE Std 1003.1)
- История проекта GNU (Richard Stallman, «Free Software, Free Society»)
- Документация к пакету GNU Coreutils (README, NEWS, ChangeLog)
- Статья «GNU Core Utilities» в Wikipedia (английская версия)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →