Запись команды dd в / dev / sdc изменил размер диска

Поведение, которое вы видите, реализовано в 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 .

2
11.01.2018, 20:12
0 ответов

Теги

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