Со встроенными модулями Bash:
Это немного некрасиво, так как нам нужно разделить 5
, чтобы избежать запятой в конце:
$ printf '%s,' {1..4}; echo 5
1,2,3,4,5
Хотя, поскольку printf
может выводить данные непосредственно в переменную, это можно обойти и удалить последнюю запятую с помощью расширения параметра:
$ printf -v tmpvar "%s," {1..5}; echo "${tmpvar%,}"
1,2,3,4,5
Или с "$*"
, которое соединяется с использованием первого символа IFS
. Это уничтожает глобальное состояние, но этого можно легко избежать, запустив его в подоболочке или в функции сlocal IFS
:
$ IFS=,; set -- {1..5}; echo "$*";
1,2,3,4,5
Если ограничения указаны в переменных, вероятно, проще всего сделать это вручную с помощью цикла, поскольку вы не можете использовать переменные в качестве конечных точек в диапазоне раскрытия фигурных скобок. Опять же, верхний предел находится в частном случае:
a=1; b=5
for (( i=a ; i<b ; i++ )); do
printf "$i,";
done;
printf "$b\n"
DPkg::Pre-Invoke
— очень общий хук, не привязанный к конкретным операциям с пакетами; в результате он не дает возможности получить список пакетов, с которыми выполняется операция.
Чтобы получить список установленных пакетов, используйте DPkg::Pre-Install-Pkg
. На справочной странице apt
есть некоторая документация , но вам, вероятно, придется поэкспериментировать. Команды, запускаемые этим хуком, по умолчанию получают список пакетов на свой стандартный ввод с различными уровнями детализации в зависимости от используемого протокола. Обратите внимание, что этот хук также вызывается при удалении пакетов, поэтому ваш обработчик должен будет проверить действие, соответствующее каждому пакету.
Установка протокола не очевидна из документации; в DPkg::Tools::options::cmd::Version
замените cmd
своей командой. См., например, apt-listbugs
, который добавляет
DPkg::Tools::Options::/usr/sbin/apt-listbugs::Version "3";
для указания версии 3 протокола.
Муру написал исчерпывающий пример на AskUbuntu , который должен прояснить ситуацию.