Поскольку OP запросил список команд (с помощью которых можно изменить соответствующие метаданные пакета) в комментариях на ответ Жиля, вот он:
# download .deb
apt download parallel
# alternatively: aptitude download parallel
# unpack
dpkg-deb -R parallel_*.deb tmp/
# make changes to the package metadata
sed -i \
-e '/^Version:/s/$/~nomoreutconfl/' \
-e '/^Conflicts: moreutils/d' \
tmp/DEBIAN/control
# pack anew
dpkg-deb -b tmp parallel_custom.deb
# install
dpkg -i parallel_custom.deb
Это сделано при предположении, что строка конфликтов имеет только moreutils
в качестве записи (и без ограничений версии), как это было в моем случае установка. В противном случае используйте '/ ^ Conflicts: / s / \ (, \) \? Moreutils \ ([^,] \ + \) \? //'
в качестве второго sed
скрипт для удаления только соответствующей части строки и поддержки ограничений версии.
Ваш установленный пакет не будет перезаписан более новыми версиями из репозитория, и вам придется вручную повторять эту процедуру для каждого обновления параллельного пакета GNU, если вы хотите поддерживать этот пакет в актуальном состоянии.
trap
Определения не распространяются на под-оболочки.
Проверьте следующим образом:
trap "echo bla" 1 2 3"
(trap)
Обработчики ловушек никогда не наследуются вложенными оболочками. Это указано в POSIX:
Когда вводится под-оболочка, ловушки, которые не игнорируются, устанавливаются на действия по умолчанию.
Обратите внимание, что проигнорированные сигналы (ловушка '' SIGFOO
) остаются проигнорированными во вложенной оболочке (и во внешних программах, запускаемых оболочкой).
trap
не распространяется на подоболочки, но некоторые способы позволяют подоболочке сообщать о ловушках родительской оболочки, а другие нет. Я сделал несколько тестов на macos с bash.
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap | cat # trap -- 'echo hello' EXIT
(trap) | cat # trap -- 'echo hello' EXIT
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # trap -- 'echo hello' EXIT
trap 'echo hello' EXIT
trap # trap -- 'echo hello' EXIT
echo "$(trap)" # trap -- 'echo hello' EXIT
trap > >(cat) # trap -- 'echo hello' EXIT
trap | cat # empty
(trap) | cat # empty
cat < <(trap) # empty
cat <<< "$(trap)" # empty
bash -c 'trap' # empty
trap & # empty
Приятно знать, что trap_output="$(trap)"
будет работать для захвата выходных данных ловушек. Я не могу придумать никакого другого способа сделать это, если это не сработало, кроме как выполнить trap >trap_output_file
для вывода в файл (fifo не будет работать вbash 3.2.57
)и затем прочитать его обратно с помощьюtrap_output="$(<trap_output_file)"
fifo не будет работать в bash 3.2.57
, потому что trap &
пусто для bash 3.2.57
, но неbash 4.4.12
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# trap -- 'echo hello' EXIT
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell
mkfifo /tmp/fifo; trap >/tmp/fifo & trap_output=$(</tmp/fifo); rm -f /tmp/fifo; echo "$trap_output"
# empty because trap >/tmp/fifo & is empty since it uses trap &
mkfifo /tmp/fifo; trap_output=$(</tmp/fifo) & trap >/tmp/fifo; rm -f /tmp/fifo; echo "$trap_output"
# empty because trap_output=$(</tmp/fifo) sets the variable in a subshell