Невозможно удалить файл - меняются только права доступа - почему?

В вашем скрипте 2 ошибки

  • переменная zне инициализирована
  • тест if(out_ar)во втором фрагменте кода не подходит для массивов

Чтобы решить первую проблему, вам нужно назначить элемент массива (наподобие z[1]=1), так как в awk нет объявления массива. (Вы не можете использовать подобный оператор, например declare -A, как в bash ).

Вторую проблему можно решить, если вы используете GNU awk, с функцией isarray()или typeof().

Таким образом, ваш код должен выглядеть так:

function add_one(in_ar, out_ar,   each) {
  if (isarray(out_ar)) {
    for (each in in_ar) {
      out_ar[each] = in_ar[each] + 1
    }
  }
  else {
    for (each in in_ar) {
      in_ar[each]++
    }
  }
}
BEGIN {
  split("1 2 3 4 5", q)
  z[1]=1
  add_one(q, z)
  print z[3]
}

Рекомендую посмотреть эту страницу и эту страницу .

0
24.03.2020, 14:02
1 ответ

Хорошо, только что понял, что происходит. Оказывается, программа выполняла задачу exec()в фоновом режиме, а более ранняя команда все еще выполнялась и работала с файлом, когда выполнялась рассматриваемая задача mvили rm.

Так вот что происходило:

  1. Первая программа открыла файл и начала его читать.
  2. Выполнялась проблематичная команда mvили rm, которая удаляла файл как обычно.
  3. Первая программа воссоздала файл и записала в него изменения.

Поскольку программа была разработана для перезаписи файла, над которым она работала, она не предоставляла никаких разрешений, когда открывала файл для записи, ожидая повторного использования существующих разрешений. Но поскольку файл был удален в середине этого процесса, был создан новый файл со случайным числом, оказавшимся в памяти для неиспользуемого параметра, определяющего права доступа к файлу.

Изменение процесса таким образом, чтобы вторая команда не запускалась до завершения первой, устранило проблему.

0
28.04.2021, 23:19

Теги

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