Делаю сейчас на баше небольшие утилиты для облегчения работы с portage и неожиданно понял, что мне не нравится концепция конфигурационного файла «всё-в-одном». В самом деле, открываем тот же /etc/make.conf и видим:
ACCEPT_KEYWORDS="~amd64"
CFLAGS="-march=corei7-avx -O2 -pipe -mfpmath=sse -msse4 -Wno-all"
CXXFLAGS="${CFLAGS}"
#CFLAGS="-march=core2 -mtune=generic -O2 -pipe -Wno-all"
#CXXFLAGS="-march=core2 -mtune=generic -O2 -pipe -Wno-all"
MAKEOPTS="-j8"
VIDEO_CARDS="nvidia"
INPUT_DEVICES="evdev"
CAMERAS="*"
LINGUAS="en ru"
ACCEPT_LICENSE="*"
DISTDIR=/sources
PORTDIR=/portage
#PORTAGE_TMPDIR=/media/home/tmp
PKGDIR=/packages
#PORTDIR_OVERLAY="/portage/local"
SYNC="rsync://mirror-kt.neolabs.kz/gentoo-portage"
GENTOO_MIRRORS="http://mirror-kt.neolabs.kz/gentoo/pub"
#SYNC="rsync://mirror.yandex.ru/gentoo-portage"
#GENTOO_MIRRORS="http://mirror.yandex.ru/gentoo-distfiles"
GRUB_PLATFORMS="multiboot pc"
#PORTAGE_NICENESS="19"
EMERGE_DEFAULT_OPTS="--quiet-build=n"
PORTAGE_BUNZIP2_COMMAND="lbunzip2 -n4"
FEATURES="parallel-fetch metadata-transfer"
#EXTRA_ECONF="-C --cache-file=/var/tmp/configure.cache"
source /var/lib/layman/make.conf
CHOST="x86_64-pc-linux-gnu"
USE="avx mmx mmxext sse sse2 sse3 ssse3 sse4 -3dnow -3dnowext X
-akonadi ass
-cleartype clucene cuda -debug dirac directfb djvu
-egl -examples extras faac faad fbcon ffmpeg fluidsynth
-gallium -gcrypt -gles -gnome gphoto2 -gpm -gstreamer -gtk -gtk+ -gtk3 -handbook
id3tag ieee1394 imagemagick -introspection jpeg2k
kvm lame lcdfilter -ldap -libnotify libv4l libv4l2 -llvm -lvm -lvm2 lzma lzo matroska midi
networkmanager
-perl plugins policykit -ppp private-headers quicktime raw
samba schroedinger semantic-desktop smp spice sqlite -static-libs symlink -systemd
-tcpd theora threads thumbnail
utils v4l vdpau vlc
webdav xattr -xinerama -zeroconf"
QEMU_USER_TARGETS="x86_64 i386"
QEMU_SOFTMMU_TARGETS="x86_64 i386"
CALLIGRA_FEATURES="krita sheets words"
видим мы энное количество строк с параметрами и значениями, а порой значения одного параметра не вмещается в одну строку (USE, например). На первый взгляд, это удобно - можно открыть один файл и посмотреть всё, что относится к сборке пакетов. Но, с другой стороны, если вам понадобится изменять какие-то параметры из скрипта, а уж тем более - из консоли, то вам придётся вертеть код для работы со строками. В моём случае мне придётся морочиться sed'ом, awk'ом, grep'ом и чёрт знает чем ещё.
А вот если бы каждый параметр лежал в отдельном файле, было бы всё намного проще. Например, нужно мне добавить флаг глобально из консоли - я делаю echo «$FLAG» >> /etc/make.conf/USE и дело в шляпе. То же самое и в скрипте - проще вписать вышеупомянутую команду, чем посредством грепов и седов вычленять из файла нужный параметр.
Наглядный пример - база установленных пакетов portage:
avalon test # ls -1 /var/db/pkg/kde-base/dolphin-4.9.1/
BUILD_TIME
CATEGORY
CBUILD
CFLAGS
CHOST
CONTENTS
COUNTER
CXXFLAGS
DEFINED_PHASES
DEPEND
DESCRIPTION
dolphin-4.9.1.ebuild
EAPI
environment.bz2
FEATURES
HOMEPAGE
INHERITED
IUSE
KEYWORDS
LDFLAGS
LICENSE
NEEDED
NEEDED.ELF.2
PDEPEND
PF
RDEPEND
repository
RESTRICT
SIZE
SLOT
USE
avalon test # cat /var/db/pkg/kde-base/dolphin-4.9.1/SIZE
2839379
avalon test # cat /var/db/pkg/kde-base/dolphin-4.9.1/IUSE
debug semantic-desktop thumbnail +handbook aqua
Каждый параметр - отдельный файл, в котором хранится значение только этого параметра. Это удобно не только для дилетантов, пишущих скрипты для своего удобства, но и просто для просмотра этих параметров. Например, можно открыть в файловом менеджере каталог с файлами-параметрами, включить предпросмотр и все параметры со значениями у вас перед глазами. Также намного проще отфильтровать файлы по нужному ключу, чем открывать конфиг в текстовом редакторе и искать там похожие ключи через поиск.
Всё вышеизложенное, конечно, не относится к профессиональным программистам, для которых создание/использование функций для работы с текстовыми файлами не представляет труда. Это так, взгляд со стороны обычного пользователя.