Как сделать ваши Bash-скрипты аппаратно-ориентированными
Написание скриптов для запуска на разных компьютерах с Linux — сложная задача. Вы не можете предположить, что у них будут одинаковые характеристики. Команда getconf
позволяет проверить сотни значений операционной системы и файловой системы.
Аппаратные сценарии
Если вы когда-либо писали сценарий, который должен работать на разных машинах с Linux, вы вполне могли столкнуться с затруднительным положением «Странно, он отлично работает на моей машине…». Небольшие различия между архитектурой компьютера, операционными системами и файловыми системами на целевых машинах могут помешать правильной работе ваших сценариев.
Если ваши сценарии просты и ничего из того, что они делают или пытаются запустить, не зависит от совместимого оборудования или определенных возможностей файловой системы, у вас никогда не возникнет проблем. Но чем сложнее становится ваш сценарий, тем более важными являются детали машины, на которой работает сценарий. Также стоит отметить, что на одном компьютере может быть установлено несколько файловых систем, смонтированных в разных частях дерева каталогов. То, что что-то работает в одном каталоге, не означает, что оно будет работать так же и в другом каталоге.
Команда getconf
может сообщать буквально о сотнях различных характеристик операционной системы и файловой системы. Некоторые из них принимают форму пар значений, одно из которых соответствует максимальному значению системы, а другое — минимальному. Это означает, что вы можете проверить параметры оборудования или файловой системы, чтобы убедиться, что ваш скрипт будет реагировать соответствующим образом.
Конечно, ваш скрипт не может использовать getconf
на целевом компьютере, если он не установлен на этом компьютере. Во всех дистрибутивах, протестированных при написании этой статьи, уже был установлен getconf
, включая Ubuntu, Fedora и Manjaro. Интересно, что все они имели одинаковую версию getconf
, версию 2.33.
Первые шаги с командой getconf
Вы можете проверить, установлен ли на вашем компьютере getconf
, и узнать его версию, используя параметр --version
.
getconf --version
Чтобы увидеть, сколько элементов может сообщить getconf
, используйте параметр -a
(все) и передайте его через команду wc
. Это будет подсчитывать строки, слова и символы в выводе.
getconf -a | wc
В выводе 320 строк. Чтобы просмотреть весь список в управляемом виде, мы направим вывод в less
.
getconf -a | less
Вы можете прокручивать список вперед и назад, чтобы увидеть, что может сообщить getconf
.
Некоторые элементы являются дубликатами. Многие из них могут быть вызваны более коротким именем или более длинным именем, совместимым с POSIX.
Отчет по отдельным значениям
Чтобы заставить getconf
сообщать об одном значении, передайте имя значения в getconf
в командной строке. Обратите внимание, что все имена опций в верхнем регистре.
getconf LONG_BIT
Опция LONG_BIT
сообщает о том, является ли ваше ядро и, следовательно, ваша операционная система 32-разрядной или 64-разрядной. Для этой команды не требуются никакие другие параметры, только сама опция LONG_BIT. Еще одно простое значение для отчета — LOGIN_NAME_MAX
.
getconf LOGIN_NAME_MAX
Это странно высокая максимальная длина имени пользователя, но это правда. Если вы действительно хотите создать учетную запись пользователя с нелепо длинным именем пользователя, вы можете это сделать. Напротив, имя хоста этого компьютера имеет максимальную длину 64 символа:
getconf HOST_NAME_MAX
Чтобы узнать, сколько одновременных процессов может выполнять учетная запись пользователя, используйте параметр CHILD_MAX
:
getconf CHILD_MAX
Значение OPEN_MAX
возвращает максимальное количество файлов, которые может открыть процесс.
getconf OPEN_MAX
Чтобы увидеть подмножество значений getconf
, мы можем использовать параметр -a
(all) для создания всех значений и использовать grep
для отфильтруйте те, которые нас интересуют. Например, чтобы увидеть каждое значение, в заголовке которого есть «ИМЯ», используйте:
getconf -a | grep NAME
Аналогичным образом, чтобы увидеть все значения с «GROUP» в названии, используйте:
getconf -a | grep GROUP
Чтобы увидеть значения, в заголовке которых есть «INT_», используйте:
getconf -a | grep _INT
Это показывает максимальное и минимальное значения, которые может содержать целочисленная переменная на этом компьютере.
Использование getconf со значениями файловой системы
Когда вы используете какие-либо параметры, относящиеся к характеристикам файловой системы, вам нужно указать getconf
, о какой файловой системе он должен сообщать. Вам нужно сделать это, даже если у вас есть только один жесткий диск и одна файловая система, установленная на нем. Команда getconf
ничего не предполагает. Чтобы указать файловую систему, о которой должен сообщать getconf
, вы должны указать путь к каталогу в этой файловой системе.
Чтобы увидеть максимальную длину имени файла для файловой системы, смонтированной в корне дерева каталогов файловой системы, введите:
getconf NAME_MAX /
Чтобы увидеть результат для другой файловой системы, укажите каталог, расположенный в другой файловой системе. Даже если у вас нет других файловых систем, постоянно смонтированных в вашем дереве каталогов, вы можете оказаться с другой файловой системой, временно присоединенной к вашему дереву каталогов.
Это именно то, что происходит, когда вы вставляете карту памяти USB, как в этом примере. Карта памяти называется «PINK» и монтируется в «/media/dave/».
getconf NAME_MAX /media/dave/PINK/
Мы можем проверить, какая файловая система находится на USB-накопителе, используя команду df
, чтобы узнать, к какому блочному устройству он подключен. Затем мы используем команду lsblk
с параметром -f
(файловая система).
df /media/dave/PINK
lsblk -f /dev/sdb1
Карта памяти — это блочное устройство /dev/sdb1
, а файловая система — FAT32
. Вот почему мы получаем разные результаты для двух каталогов в одном дереве каталогов. Они находятся в одном дереве каталогов, но имеют разные базовые файловые системы.
Использование getconf в скриптах
Мы можем легко включить вывод getconf
в решения внутри наших сценариев оболочки.
Например, для выполнения различных действий в зависимости от того, работает ли сценарий в 32-разрядной или 64-разрядной операционной системе, вы можете использовать такой раздел сценария.
#!/bin/bash # are we on a 32 or 64 bit OS? if [ $(getconf LONG_BIT) = "64" ] then # 64 bit echo "64-bit machine." else # 32 bit echo "32-Bit machine." fi
Оператор if
сравнивает выходные данные команды getconf LONG_BIT
со значением 64. Если они совпадают, выполняется предложение then
, в противном случае выполняется предложение else
. Вы можете либо выполнять действия, зависящие от версии, в предложениях then/else
, либо устанавливать флаги переменных, которые можно проверить в другом месте вашего скрипта.
Скопируйте текст сценария в редактор и сохраните файл как «hw-test.sh». Мы сделаем скрипт исполняемым с помощью команды chmod
и параметра -x
(исполняемый).
chmod +x hw-test.sh
Когда мы запускаем скрипт, он сообщает нам, какие из предложений были активированы. Используя этот метод, вы можете использовать любое из значений getconf
, чтобы указать вашему сценарию выполнить соответствующее действие.
./hw-test.sh
Опция Overkill
Количество значений, о которых может сообщить getconf
, может быть ошеломляющим. Страница man
на удивление краткая. Если вы ожидаете, что он перечислит варианты и объяснит каждый из них, вы будете разочарованы.
Вы найдете некоторые описания на страницах man
для sysconf
и confstr
. Возможно, вам придется обрезать несколько символов перед записями confstr
. Например, это не сработало:
getconf _CS_GNU_LIBC_VERSION
но это сделало:
getconf GNU_LIBC_VERSION
Вы также найдете некоторые описания в файле «limits.h». Если вы не знаете, где находится этот файл в вашей системе, используйте:
whereis limts.h
Затем вы можете использовать less
для просмотра этого файла.