Что ж, вам не нужно иметь две отдельные команды find
:
find abc -type f -exec sed -n 's/test/best/pg' {} + -exec sed -i 's/test/best/g' {} +
... и вы этого не сделаете необходимо ./
перед abc
.
Вы можете переопределить переменную среды$SYSTEMD_EDITOR
, чтобы использовать другую команду, отличную от вашего редактора, при запуске systemctl edit
.
Например, использование чего-то вроде SYSTEMD_EDITOR='cp /path/to/source.file'
, кажется, работает нормально (, хотя это довольно уродливо, ожидая, что туда будет добавлен последний аргумент systemd!)
Для вашего конкретного случая вы можете использовать:
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} >~/tmp/sddm-override.conf
$ sudo env SYSTEMD_EDITOR="cp $HOME/tmp/sddm-override.conf" systemctl edit sddm
Но все, что на самом деле делает systemctl edit
, — это создает файл переопределения (в своем случае с именемoverride.conf
)в каталоге /etc/systemd/system/<service>.service.d/
, который создается, если он не существует... Так что делать это напрямую — это также вполне приемлемый подход. (См. упоминания о "вставить -" и "переопределить" на справочной странице для systemd.unit для более подробной информации.)
Итак, в вашем случае это было бы подходящим решением:
$ sudo mkdir -p /etc/systemd/system/sddm.service.d/
$ { echo "[Service]";
echo "ExecStartPre=/bin/sleep 5";
} | sudo tee /etc/systemd/system/sddm.service.d/10-startup-delay.conf
$ sudo systemctl daemon-reload
Который помещает файл с ожидаемым содержимым в каталог «drop -in» для вашего устройства, и в этом случае вы также можете назвать его соответствующим образом в соответствии с тем, что он пытается выполнить.
ОБНОВЛЕНО:Как указывает @GracefulRestart, вам нужен systemctl daemon-reload
после добавления капли -напрямую.
Я хочу повторить ответ, данный в 3 , но я делаю это таким образом, используя тройник
env SYSTEMD_EDITOR=tee sudo -E systemctl edit --system [your_unit_name] < [your_content_file]
Делая это таким образом, вы можете передавать содержимое через стандартный ввод, а не из файла, что может быть полезно при вызове systemctl из скрипта.
Я бы атаковал файл напрямую:
sed -i 's/\[Service]/ a\
ExecStartPre=/bin/sleep 5' /usr/lib/systemd/system/sddm.service
Поскольку я еще не нашел, как использовать systemctl edit
в скрипте, лучше всего было бы смоделировать команду systemctl edit sddm
и поместить переопределение в каталог /etc/systemd/system, а служебные единицы — в /usr. /lib/systemd/system может быть изменен при обновлении пакетов:
UNIT='sddm.service'
DIR="/etc/systemd/system/${UNIT}.d"
mkdir $DIR
echo -e "[Service]\nExecStartPre=/bin/sleep 5" > ${DIR}/override.conf
systemctl daemon-reload
Это должно быть примерно эквивалентно тому, что делает systemctl edit sddm
.
Вы можете изменить то, что редакторsystemctl(8)
использует для своей подкомандыedit
с помощью переменной SYSTEMD_EDITOR
. По сути, это создает команду, последним аргументом которой всегда является systemctl(8)
созданный временный файл, в который после записи он перемещается в override.conf
.
Из-за этого мы можем использоватьtee(1)
как SYSTEMD_EDITOR
, а затем перенаправить любой текст, который мы хотим, из оболочки на всю команду systemctl(8)
на стандартном вводе. Например, перенаправление здесь -документа:
SYSTEMD_EDITOR=tee systemctl edit sddm <<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
Это создает папку -в файле /etc/systemd/system/ssdm.service.d/override.conf
с содержимым между «словами» EOF
.
Под -капотом -подкоманда edit
выглядит примерно так:
# Create drop-in directory for service
mkdir -p /etc/systemd/system/ssdm.service.d
# Create empty temporary file
touch /etc/systemd/system/ssdm.service.d/.
# Pass temporary file as last argument of SYSTEMD_EDITOR
tee /etc/systemd/system/sddm.service.d/.\#override.conf846580011dbe64db/.\#override.conf846580011dbe64db<<EOF
[Service]
ExecStartPre=/bin/sleep 5
EOF
# Rename temporary file
mv /etc/systemd/system/sddm.service.d/{.\#override.conf846580011dbe64db,override.conf}
После редактирования юнита конфигурация systemd перезагружается автоматически (способом, эквивалентнымdaemon-reload
).