Наследуется ли ловушка подоболочкой?

Поскольку 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, если вы хотите поддерживать этот пакет в актуальном состоянии.

14
12.05.2016, 14:03
3 ответа

trap Определения не распространяются на под-оболочки.

Проверьте следующим образом:

trap "echo bla" 1 2 3"

(trap)

1
27.01.2020, 19:51

Обработчики ловушек никогда не наследуются вложенными оболочками. Это указано в POSIX:

Когда вводится под-оболочка, ловушки, которые не игнорируются, устанавливаются на действия по умолчанию.

Обратите внимание, что проигнорированные сигналы (ловушка '' SIGFOO) остаются проигнорированными во вложенной оболочке (и во внешних программах, запускаемых оболочкой).

14
27.01.2020, 19:51

trapне распространяется на подоболочки, но некоторые способы позволяют подоболочке сообщать о ловушках родительской оболочки, а другие нет. Я сделал несколько тестов на macos с bash.

GNU bash, версия 4.4.12 (1 )-выпуск (x86 _64 -яблоко -darwin16.3.0):

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

GNU bash, версия 3.2.57 (1 )-выпуск (x86 _64 -яблоко -darwin16):

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

GNU bash, версия 4.4.12 (1 )-выпуск (x86 _64 -яблоко -darwin16.3.0):

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

GNU bash, версия 3.2.57 (1 )-выпуск (x86 _64 -яблоко -darwin16):

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
6
27.01.2020, 19:51

Теги

Похожие вопросы