Поведение, которое вы видите, реализовано в archives.c
в dpkg
исходнике, строка 1030 (для версии 1.18. 1):
debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
ohshite(_("unable to make backup link of '%.255s' before installing new version"),
ti->name);
Мне кажется, что вы можете справиться с отказом ссылки, вернувшись к поведению переименования, используемому в строках 1003 и последующих; что-то вроде (это не проверено):
debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
debug(dbg_eachfiledetail,"link failed, nonatomic");
nifd->namenode->flags |= fnnf_no_atomic_overwrite;
if (rename(fnamevb.buf,fnametmpvb.buf))
ohshite(_("unable to move aside '%.255s' to install new version"),
ti->name);
}
Я не эксперт по dpkg
, хотя... (И в dpkg
нет опции, доступной для такого поведения)
.
La trampa KEYBD documentada en la página del manual de ksh se llama para una secuencia de caracteres entrantes que comienza con escape. No se describe el final de esta secuencia, pero parece que ;
la terminará.
Suponiendo que su función de combinación de teclas es como se indica en este artículo , entonces su vinculación falla porque el código trampa se llama primero para \e[1;
, luego para 5
y D
.
Una solución es cambiar el código trampa para recordar la secuencia inicial y usarla más tarde, de la siguiente manera:
# original code from http://www.bolthole.com/solaris/ksh-oddthings.html
typeset -A Keytable
# trap 'eval "${Keytable[${.sh.edchar}]}"' KEYBD
function keybind # key action
{
typeset key=$(print -f "%q" "$2")
case $# in
2) Keytable[$1]='.sh.edchar=${.sh.edmode}'"$key" ;;
1) unset Keytable[$1] ;;
*) print -u2 "Usage: $0 key [action]" ;;
esac
}
# new function to handle ";" causing end of sequence
# https://unix.stackexchange.com/a/425980/119298
function myfn {
typeset -S state
case "$state${.sh.edchar}" in
$'\e[1;') state=${.sh.edchar}
.sh.edchar=
return ;;
$'\e[1;5') state="$state${.sh.edchar}"
.sh.edchar=
return ;;
$'\e[1;5'?) state=
.sh.edchar=$'\e[1;5'"${.sh.edchar}" ;;
esac
eval "${Keytable[${.sh.edchar}]}"
}
trap myfn KEYBD
keybind $'\e[1;5D' $'\eb'
keybind $'\e[1;5C' $'\ef'