Активация сокета Systemd: убить скрипт bash при закрытии сокета

[A-Z]не означает верхний регистр. Это означает буквы от Aдо Z, которые могут включать строчные буквы -. Обычно вместо этого следует использовать [[:upper:]]. (Это работает в Bash даже без extglob.)

Какие символы соответствуют [A-Z], зависит от вашей локали.

Вы пояснили, что хотите показывать все имена файлов, которые содержат как минимум -верхний регистр в любом месте --не только имена файлов, полностью состоящие из верхнего регистра --, но и то, что при использовании ls *[A-Z]*, вы получаете некоторые имена файлов, в которых нет каких-либо символов верхнего -регистра.

Это происходит, когда лексикографический порядок вашей локали перемежается прописными -и строчными -буквами (, например, AaBbCcDd... ). Хотя вы можете установить другую локаль (, например, LC_ALL=C), лучшим решением обычно является запись шаблона, который специально соответствует буквам верхнего регистра -.

Какие символы являются заглавными буквами -также могут различаться в зависимости от региона, но, по-видимому, если что-то является заглавной -буквой в вашем регионе, вы захотите включить это. Так что это скорее преимущество [[:upper:]], чем недостаток.

Вместо этого используйте [[:upper:]].

Большинство оболочек в стиле Bourne -, таких как Bash, поддерживают классы символов POSIX в подстановках. Эта команда выведет список записей в /etc, в именах которых есть хотя бы одна заглавная буква -:

.

ls -d /etc/*[[:upper:]]*

Некоторые записи, которые вы получаете, могут быть каталогами. Если вы хотите показать их содержимое, а не просто список каталогов, вы можете удалить флаг -d. Вы также можете поместить флаг --перед шаблоном, если у вас есть записи в /etc, которые начинаются с -. Хотя, наверное, нет. (В скрипте обычно нужно использовать здесь --.)

Вам, вероятно, не нужны dotfiles, но если они нужны...

Здесь не будут отображаться записи, начинающиеся с .. Обычно вы не хотите их показывать. Если они вам нужны, большинство оболочек позволяют вам написать один шаблон, который также соответствует им, или настроить подстановку, чтобы включать их по умолчанию. Параметр автоматического включения ведущих записей-.в Bash — dotglob, и его можно включить с помощью shopt -s dotglob. Для других оболочек см. . Или вы можете просто написать для них второй глобус:

ls -d /etc/*[[:upper:]]* /etc/.*[[:upper:]]*

Большинство популярных оболочек в стиле Bourne -поддерживают раскрытие фигурных скобок, поэтому вы можете написать это более компактно и с меньшим количеством повторений:

ls -d /etc/{,.}*[[:upper:]]*

В большинстве оболочек, включая Bash, когда вы пишете два отдельных универсальных объекта,вы получите сообщение об ошибке, если какой-либо из них не раскрывается --, потому что поведение по умолчанию в большинстве оболочек состоит в том, чтобы передать его нераскрытым. Но lsпо-прежнему будет показывать записи, совпадающие с другой. Но , как указал Stéphane Chazelas , в некоторых оболочках, включая очень популярную Zsh, вся команда не выполняется и lsникогда не запускается. Если вы используете оболочку в интерактивном режиме, это не очень опасно, потому что вы можете изменить команду запустить ее снова, но такие конструкции не подходят для переносимых скриптов. Bash также будет вести себя таким образом, если вы установите параметр оболочки failglob.

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

В Bash вам не нужно включать расширенные подстановки, чтобы использовать классы символов POSIX в шаблонах подстановок. В моей системе с Bash 4.3.48:

ek@Io:~$ shopt extglob
extglob         off
ek@Io:~$ ls -d /etc/*[[:upper:]]*
/etc/ConsoleKit     /etc/LatexMk         /etc/ODBCDataSources  /etc/UPower
/etc/ImageMagick-6  /etc/NetworkManager  /etc/rcS.d            /etc/X11

Но вам нужно, чтобы имена файлов соответствовали только заглавным -буквам.

Вам нужно расширенное подстановочное значение, если вы хотите сопоставить имена файлов, состоящие только из букв верхнего -регистра. Затем вы должны использовать +([[:upper:]])или *([[:upper:]]), и это расширенные глобусы.

Если вы используете Bash, см. эту статью , это руководство , 3.5.8.1 Сопоставление шаблонов в руководстве GNU Bash для подробностей. См. также ответ Стефана Шазела .

2
05.06.2019, 01:03
1 ответ

Нет, systemd не остановит службу при закрытии соединения.

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

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

1
27.01.2020, 22:17

Теги

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