Ошибка при выполнении сценариев в среде chroot [закрыто]

Вот решение который заимствует части ответов l0b0 и DopeGhoti (и, в меньшей степени, соронтара). Как и в этих ответах, мой использует $LINENO для определения номера строки; в отличие от них, я использую ловушку для запуска отчетов. команда bash trap описана в bash(1):

trap [-lp] [[arg] sigspec ...]

    Команда arg должна быть прочитана и выполнена когда оболочка получает сигнал(ы) sigspec. … ⁠ ︙
    …  Если sigspec является DEBUG, команда arg выполняется перед каждой простой командой, for команда, case команда, select команда, каждая арифметическая команда для, и до выполнения первой команды в функции оболочки…

Итак, этот скрипт:

$ cat -n myscript
     1  #!/bin/bash
     2  trap 'printf "%3d: " "$LINENO"' DEBUG
     3  date
     4  sleep 30
     5  date
     6  sleep \
     7        11
     8  date
     9
    10  ls -l
    11  for f in *
    12  do
    13          echo "$f"  &&
    14                         ls -ld "$f"
    15  done
    16
    17  for ((i=0; i<3; i++))
    18  do
    19          echo "i = $i"; date
    20  done
    21
    22  echo $((5+25+12))
$

запускает команду printf "%3d: " "$LINENO" перед каждой командой в скрипте и выдает следующий вывод:

$ ./myscript
  3: Wed, Apr 05, 2017 10:16:17 AM
  4:   5: Wed, Apr 05, 2017 10:16:47 AM
  7:   8: Wed, Apr 05, 2017 10:16:58 AM
 10: total 4
-rwxr-xr-x 1 myusername mygroup 221 Apr  5 10:01 myscript
-rwxr-xr-x 1 myusername mygroup 252 Apr  5 10:01 myscript2
-rw-r--r-- 1 myusername mygroup 132 Apr  5 09:59 myscript2.log
-rw-r--r-- 1 myusername mygroup  45 Apr  5 08:34 other_file
 11:  13: myscript
 14: -rwxr-xr-x 1 myusername mygroup 221 Apr  5 10:01 myscript
 11:  13: myscript2
 14: -rwxr-xr-x 1 myusername mygroup 252 Apr  5 10:01 myscript2
 11:  13: myscript2.log
 14: -rw-r--r-- 1 myusername mygroup 132 Apr  5 09:59 myscript2.log
 11:  13: other_file
 14: -rw-r--r-- 1 myusername mygroup  45 Apr  5 08:34 other_file
 17:  17:  19: i = 0
 19: Wed, Apr 05, 2017 10:16:59 AM
 17:  17:  19: i = 1
 19: Wed, Apr 05, 2017 10:16:59 AM
 17:  17:  19: i = 2
 19: Wed, Apr 05, 2017 10:16:59 AM
 17:  17:  22: 42
$

Примечания:

  • Подобно ответу l0b0, это минимально инвазивно — просто добавьте строку 2.
  • В отличие от ответа l0b0, это не отображает сами команды - но вы не просили его сделать это.
  • Второй сон, который охватывает строки скрипта 6 и 7, сообщается как строка 7.
  • Строка 11 (для f в *) сообщается один раз перед каждой итерацией цикла for.
  • echo "$f" и ls -ld "$f" сообщаются правильно в соответствующих строках (13 и 14).
  • Строка 17 (for ((i=0; i) сообщается дважды перед каждой итерацией этого цикла for, и еще дважды после последней итерации.
  • В отличие от set -x, LINENO и PS4 (которые указаны в стандарте POSIX), ловушка DEBUG является расширением bash и не будет работать во всех оболочках.
  • Ловушка DEBUG может запускать любые команды, и не ограничивается записью в стандартный вывод скрипта или стандартная ошибка.

Вопрос гласит: «Проверьте, какой номер строки сценария bash выполняется «прямо сейчас»  без указания пользовательского интерфейса. Другой подход состоит в том, чтобы постоянно записывать номер текущей строки. в файл журнала:

$ diff myscript myscript2
2c2
< trap 'printf "%3d: " "$LINENO"' DEBUG
---
> exec 6> myscript2.log  &&  trap 'printf "%3d\n" "$LINENO" >&6' DEBUG
$ ./myscript2
Wed, Apr 05, 2017 10:23:50 AM
Wed, Apr 05, 2017 10:24:20 AM
Wed, Apr 05, 2017 10:24:31 AM
total 4
-rwxr-xr-x 1 myusername mygroup 221 Apr  5 10:01 myscript
-rwxr-xr-x 1 myusername mygroup 252 Apr  5 10:01 myscript2
-rw-r--r-- 1 myusername mygroup  24 Apr  5 10:23 myscript2.log
-rw-r--r-- 1 myusername mygroup  45 Apr  5 08:34 other_file
myscript
-rwxr-xr-x 1 myusername mygroup 221 Apr  5 10:01 myscript
myscript2
-rwxr-xr-x 1 myusername mygroup 252 Apr  5 10:01 myscript2
myscript2.log
-rw-r--r-- 1 myusername mygroup  60 Apr  5 10:23 myscript2.log
other_file
-rw-r--r-- 1 myusername mygroup  45 Apr  5 08:34 other_file
i = 0
Wed, Apr 05, 2017 10:24:31 AM
i = 1
Wed, Apr 05, 2017 10:24:31 AM
i = 2
Wed, Apr 05, 2017 10:24:31 AM
42
$

Мы можем отслеживать выполнение этого скрипта отслеживая содержимое файла myscript2.log с другого терминала. Например, во время второго сна,

$ tail myscript2.log
  3
  4
  5
  7

1
26.08.2018, 18:05
2 ответа

после поиска я решил свою проблему, очистив пакет appstreamвнутри chroot:

# apt purge appstream

, а затем выполнить команду очистки с помощью команды autoremove:

# apt-get remove --purge -y gnome* kodi* tilix* rhythmbox* && apt autoremove

и повторная переустановка пакета appstearm

0
28.01.2020, 00:30

Я столкнулся с похожей проблемой при запуске

sudo apt-get upgrade

У меня была почти такая же ошибка Консоль рекомендовала запустить следующее:

sudo apt --fix-broken install

и это устранило ошибку для меня.

0
28.01.2020, 00:30

Теги

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