Проблемы с выводом grep в массив

Ответ M. Dickey systemd немного расплывчатый. Вот подробности для операционной системы systemd.

Служба, которая представляет запрос на вход в систему, является экземпляром шаблона getty@.service, getty@tty6.serviceдля службы входа, например, на tty6. Чтобы заменить это своей собственной службой на таком терминальном устройстве, вам нужно сделать две вещи.

Создайте определение службы.

Это довольно просто:

# /etc/systemd/system/my-terminal-ui@.service

[Unit]
Description=Custom user interface on %I
Documentation=https://unix.stackexchange.com/a/318336/5132
Conflicts=getty@%I.service
Before=getty.target

[Service]
ExecStart=/usr/local/sbin/my-custom-user-interface
StandardInput=tty
StandardOutput=tty
Restart=always
RestartSec=1
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
SendSIGHUP=yes

[Install]
WantedBy=multi-user.target

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

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

Это более сложная часть.

Для начала вам нужно решить , на каком виртуальном терминальном устройстве ядра это будет работать. Здесь в игру вступает несколько фрагментов информации:

  • В мире Fedora с 2008 года графический пользовательский интерфейс использует первое виртуальное терминальное устройство ядра, tty1. Вы должны выбрать между отказом от использования этого виртуального терминального устройства и отказом от использования (или ручной настройки )графического пользовательского интерфейса.
  • systemd пытается запросить -запуск служб входа в систему на виртуальных терминалах ядра до максимального значения, установленного в NAutoVTsв файле конфигурации logind.conf. По умолчанию это от tty1до tty6.
  • Это оставляет tty7свободным в мире Fedora. Но в мире Debian, несмотря на то, что Debian теперь является операционной системой systemd, графический интерфейс пользователя использует tty7. Возможно, вы захотите принять во внимание перенос на Debian.
  • Мир systemd пытается сделать виртуальный терминал ядра #6 приглашение для входа в систему, которое «всегда там», то, которое вы нажимаете на мышечную память Control + Alt + F6 для.

Допустим, вы выбираете tty5.

Вам нужно остановить вход в систему по требованию -, запуская autovt@tty5.service, что является другим названием getty@tty5.service, всякий раз, когда пользователь переключается на виртуальный терминал ядра #5. Вы можете сделать это, понизив NAutoVTsустановка в logind.confот 6 до (произнесите )4.

Вам необходимо убедиться, что ваш сервис автоматически запускается при начальной загрузке системы, т. е. что он «включен»:

systemctl enable my-terminal-ui@tty5.service

Альтернативы

Есть и другие способы сделать это.

служба без -шаблона

Вместо my-terminal-ui@.serviceвведите my-terminal-ui.serviceи закрепите имя оконечного устройства в устройстве, заменив %Iна (, скажем)tty5.

Я дал это как определение шаблона, потому что это упрощает выбор, отличный от tty5.

используя одно изautovt@ttyN вместо своего имени

Вы можете использовать /etc/systemd/system/autovt@tty5.serviceв качестве имени определения службы. Это заменит создание экземпляра шаблона autovt@.service.

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

Недостатком является то, что механизм запуска по запросу -был разработан для того, чтобы не запускать процессы входа на неиспользуемых виртуальных терминалах ядра. Таким образом, ваша служба не будет запускаться при начальной загрузке системы, а будет запускаться только при первой активации виртуального терминала ядра #5. Этот запуск по запросу -может быть не тем, что вам нужно. Другие части вашей пользовательской системы могут ожидать, что ваша служба уже запущена , например, начиная с начальной загрузки.

редактированиеgetty@ttyN

Люди, привыкшие к /etc/ttysи /etc/inittab, рассматривают изменение getty@tty5.serviceкак способ что-то делать. Они запускают такие команды, как

systemctl edit getty@tty5.service

и добавьте переопределение, в котором указано

[Service]
# This blank assignment is not a mis-print.
ExecStart=
ExecStart=/usr/local/sbin/my-custom-user-interface

Это имеет несколько проблем.

Сделать так, чтобы служба с именем getty не запускала программу {a, min, f} getty— не очень удобная идея. Спустя годы, когда вы забудете, что вы здесь сделали, или когда кто-то другой возьмет на себя администрирование такой системы, не будет очевидно, что службы «getty» не всегда работают gettyполезность.

Не думайте о getty@.serviceкак о пространстве для всего, что запускается на этом терминале , которое можно модифицировать по мере необходимости. Это не совсем системный способ думать об этом. getty@.serviceзапускает программу "getty". Служба, которая запускает совершенно другую программу, которая не запускает ничего похожего на службу «getty», должна быть отдельным определением службы сама по себе.

Более того :Отдельное определение службы позволяет не определять службу как что-то вроде службы "getty". Вышеупомянутое определение службы копирует большую часть поведения службы "getty", в том числе изо всех сил пытается очистить ваш экран(так, как мир хочет, чтобы вы делали ). Но вы можете не захотеть, скажем, TTYReset=yesили возиться с utmpxв такой службе, как ваша, которая на самом деле не является службой «входа» и может не захотеть, чтобы ее экран очищался так агрессивно.

Более того :Отдельное определение службы проще изменить в будущем. Перейти с tty5(, если это неудовлетворительно, )на tty8можно просто с помощью вышеупомянутого шаблона. Просто создайте экземпляр на tty8вместо tty5. Несколько сложнее отменить -выбор набора локальных настроек из getty@tty5.service, а затем повторно -настроить их против getty@tty8.service.

псевдоним autovt@tty5наmy-terminal-ui@tty5

Это логическое продолжение редактирования getty@tty5.service, так как очевидно, чтоautovt@ttyN псевдонимы представляют собой все, что должно быть запущено здесь механизм, который позволяет заменять другие вещи дляgetty@ttyН .

Но он страдает теми же вышеупомянутыми недостатками, что и использование имени autovt@tty5.serviceнапрямую, поскольку он связан с попытками logind не запускать службы входа в систему , что может быть не тем, что вам нужно. На самом деле это то, что должно быть требование-начато здесь пользователем logind.

Дальнейшее чтение

3
02.08.2019, 09:20
1 ответ

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

n=0
printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path' >> export_list.txt
while read -r table
do
    extract[$n]=$(egrep -ilrs "$table" /path/to/file | egrep -i tag | egrep -v backup)
    file_name=$(basename "${extract[$n]}")
    printf '%s,%s,%s\n' "$table" "$file_name" "${extract[$n]}" >> export_list.txt
    n=$((n+1))
done < table_list.txt
  1. Строка формата printfвсегда должна быть отделена от фактического содержимого.(printf '%s,%s,%s\n' 'table_name' 'file_name' 'full_path')
  2. При использовании readпочти всегда следует использовать аргумент -r. Это позволит ему читать escape-символ \как литерал
  3. всегда двойные кавычки ваших переменных. Из-за это и это .
  4. Существует специальный синтаксис, который необходимо использовать при обращении к массиву/элементу массива. То есть${array[@]}(весь массив )или${array[0]}(первый элемент в массиве ). Когда вы вызываете его как $array, вы всегда получаете только первый элемент.
  5. Из-за вышеизложенного нам нужен способ гарантировать, что мы захватываем правильный элемент массива на каждой итерации. Для этого я добавил переменную n, которая будет увеличиваться на каждой итерации вашего цикла.

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

Также обратите внимание :Ваш вопрос помечен как "скрипт оболочки -", но массивы не указаны в стандарте POSIX, поэтому, хотя большинство версий /bin/sh их поддерживают, нет никакой гарантии, что ваша поддерживает.

1
27.01.2020, 21:29

Теги

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