User=someuser
в системной службе определяет системную службу, которая не запускается от имени пользователя root. Системная служба будет работать независимо от входа пользователя в систему; он будет продолжать работать, даже если никто не войдет в систему. Запуск служб на выделенных учетных записях служб, когда это возможно, является хорошей защитой, но иногда службы должны запускаться с правами root и переходить на учетную запись службы самостоятельно, возможно, после выполнения некоторых начальных операций, которые традиционно требуют доступа с правами root, например открытие порта TCP или UDP. с номером порта ниже 1024.
--user
сервисы запускаются для зарегистрированных -пользователей. По умолчанию предполагается, что все пользовательские службы останавливаются, когда пользователь, которому они принадлежат, выходит из своего последнего оставшегося сеанса в системе; однако системный администратор может разрешить пользовательские процессы оставаться после выхода из системы. В некоторых дистрибутивах это даже разрешено по умолчанию, потому что системы Unix/Linux исторически не были строгими в отношении пользовательских процессов во время выхода из журнала -, и пользователи могут ожидать, что они могут оставить фоновые процессы запущенными при выходе из системы. не делая ничегоsystemd
-конкретного.
(С другой стороны, администраторам многопользовательских -систем традиционно приходилось внедрять различные решения для очистки -старых пользовательских процессов, т.е. когда пользователь ноутбука на самом деле не выходит из системы, а просто закрывает крышку ноутбука и уходит со своим ноутбуком. systemd
позволяет при необходимости точно нацелить процессы каждого сеанса на завершение,но в результате системный администратор должен будет принять политическое решение о том, нужна ли и когда требуется автоматическая очистка сеанса -.)
Если один и тот же пользователь входит в несколько сеансов одновременно, у него будет запущена только одна копия их --user
служб. Таким образом, службы --user
на самом деле не связаны с каким-либо конкретным сеансом пользователя, а только с самим пользователем.
Я думаю, что наличие службы --user
, работающей от кого-то другого, кроме вошедшего в систему -пользователя, сеансу которого она принадлежит, было бы полезно только в очень ограниченных случаях. Если доступ к службе должен быть ограничен только какой-либо общей учетной записью, то я думаю, что обычно лучше сделать ее системной службой, чтобы была возможность поделиться доступом для администрирования службы (и, следовательно, для администрирования. ответственность )перед другими, имеющими доступ к общей учетной записи, если это необходимо.
Во-первых, вы можете просто использовать сам файл. Это намного проще, чем пытаться использовать массив оболочки :
.grep -f file1.txt file2.txt
Это напечатает любые строки из file2.txt
, которые соответствуют любым строкам в file1.txt
.
Если вы по какой-то причине должны использовать массив, все становится сложнее. Вы не можете просто сделать grep "${array[*]}" Textfile
, потому что "${array[*]}"
расширится до списка элементов в массиве, разделенных пробелом:
$ array=("foo" "bar" "baz")
$ echo "${array[*]}"
foo bar baz
Это означает, что ваша grep
команда станет:
grep 'foo bar baz' file
И это означает "grep для foo bar baz
в файле file
". Что вы хотите сделать, так это найти foo
, или bar
, илиbaz
. Это можно сделать с помощью опции -E в grep
и объединения паттернов, которые вы хотите найти, с помощью |
:
grep -E 'foo|bar|baz' file
Для этого вам нужно будет сделать что-то сложное, например:
grep -E "$(printf '%s|' "${array[@]}" | sed 's/|$//')" file
Или, может быть,:
grep -E "$(export IFS="|"; echo "${array[*]}")" file
В целом, просто лучше, быстрее и проще использовать файл и забыть о массиве.
grep "${array[*]}" Textfile
Будет работать до тех пор, пока вы установите IFS
на новую строку (или что-то, что начинается с новой строки ), и используйте --
или -e
, чтобы убедиться, что это все еще работает, даже если первый элемент начинается с -
.
"${array[*]}"
в оболочках Korn -, подобно "$*"
в оболочках POSIX, расширяется до списка элементов, объединенных первым символом $IFS
. Значение по умолчанию для $IFS
равно<SPC><TAB><NL>
(<SPC><TAB><NL><NUL>
в zsh
), поэтому по умолчанию вы получите элемент, объединенный символами SPC. Для grep
вам нужно, чтобы разные регулярные выражения были разделены новой строкой, чтобы grep
зацикливалось для каждого из них по очереди.
IFS=$'\n'
grep -e "${array[*]}" file
В zsh
выполнениеgrep -e "${(pj:\n:)array}" file
(явного j
перехода с новой строки вместо изменения $IFS
глобального )илиgrep -e$^array file
(расширения массива в стиле fish
/ rc
-, где становится grep -efirst -esecond file
, что является еще одним способом предоставления нескольких шаблонов для grep
), который был бы чище.
Другой вариант — сделать:
printf '%s\n' "${array[@]}" | grep -f - file
На этот раз список шаблонов с разделителями -передаётся через стандартный ввод grep
, а не через аргумент.
Эти подходы будут работать независимо от того, являются ли шаблоны фиксированными строками (с -F
), расширенными регулярными выражениями (с-E
)или базовыми регулярными выражениями (по умолчанию ).
Вы можете убедиться, что список паттернов не пуст:
(( ${#array[@]} > 0 )) && grep...
Вызов grep
с пустым шаблоном дает разные результаты в зависимости от реализации grep
и, как правило, не то, что вы хотите.