Поведение, которое вы видите, реализовано в archives.c
в источнике dpkg
, line 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
уже нет возможности обеспечить такое поведение.)
-121--20953-
Как напечатать нескрытую версию аргументов командной строки?
print ARGV[1]
Проблема в том, что не требуется использовать нескрытый аргумент командной строки. Ты хочешь интерпретировать это. Вы передаете \t
(двухсимвольный ряд обратная косая черта, строчная буква T), и вы хотите перевести его в обратную косую черту. Вам нужно будет сделать это вручную. Просто перевести \t
на вкладку просто - gsub (/\\t/, «\t »)
- но если вы хотите поддержать восьмеричные побеги и удалить обратную косую черту перед нераспознанным персонажем, это громоздко в трепете.
split ARGV[1], a, "\\";
s = a[1]; delete a[1];
for (x in a) {
if (skip_next) {
skip_next = 0;
} else if (x == "") {
s = s "\\";
skip_next = 1;
} else if (x ~ /^[0-7][0-7][0-7]/) {
s = s sprintf("%c", 64*substr(x,1,1) + 8*substr(x,2,1) + substr(x,3,1));
sub(/^.../, x);
} else if (x ~ /^[0-7][0-7]/) {
s = s sprintf("%c", 0 + 8*substr(x,1,1) + substr(x,2,1));
sub(/^../, x);
} else if (x ~ /^[0-7]/) {
s = s sprintf("%c", 0 + substr(x,1,1));
sub(/^./, x);
} else {
sub(/^a/, "\a", x) ||
sub(/^b/, "\b", x) ||
sub(/^n/, "\n", x) ||
sub(/^r/, "\r", x) ||
sub(/^t/, "\t", x) ||
sub(/^v/, "\v", x);
}
s = s x;
}
(Предупреждение: непроверенный код!) Вместо этого сложного кода можно вызвать printf
в дополнительной оболочке. Даже это не так просто сделать, когда последовательность может быть многострочной.
s = ARGV[1]
gsub(/'/, "'\\''", s)
cmd = "printf %b '" s "'."
s = ""
while ((cmd | getline line) > 0) s = s line "\n"
sub(/..$/, "", s)
Обратите внимание, что при записи «\t »
в скрипте awk это последовательность, содержащее символ табуляции. Это путь трепетный синтаксис: обратная косая черта имеет особое значение в последовательность литерале. Примечание: в последовательности литерал , а не в последовательности . Если последовательность содержит обратную косую черту, это просто другой символ. Фрагмент исходного кода «\t »
, состоящий из четырех символов, представляет собой выражение, значение которого является односимвольным рядом, содержащим вкладку, в том же пути, что и фрагмент исходного кода 2 + 2
, состоящий из трех символов, является выражением, значением которого является число 4
.
Лучше бы сценарий с неловкостью принял аргумент разделителя как буквенную последовательность. Это упростило бы использование: ваш интерфейс требует от вызывающего абонента избежать обратных косых черт в аргументе. Если разделитель должен быть табуляцией, передайте фактический символ табуляции.
-121--75065-
В bash
* необходимо использовать такие скобки, как
echo ${A1[$each]}
, чтобы сделать [$ каждый]
индексом в массиве A1
.
Per man bash (1):
На любой элемент массива можно ссылаться с помощью $ {name [subscript]}. Фигурные скобки необходимы для предотвращения конфликтов с расширением пути.
Далее говорится:
Ссылка на переменную массива без подстрочного индекса эквивалентна ссылке на массив с подстрочным индексом 0.
Поэтому исходный код не работает, так как оболочка видит нижний индекс только при использовании фигурных скобок.
Так
echo $A1[$each]
эквивалентно
echo ${A1[0]}[$each]
, где квадратные скобки не имеют особого значения, поэтому печатаются как есть.
кш
,и в zsh
, если установлен параметр KSH _ ARRAYS
.