Я считаю, что самый простой способ, который не предполагает изобретения велосипеда, будет sudo
. Вы по-прежнему можете предоставить пользователю ограниченное количество команд, а именно systemctl restart httpd
, используяvisudo
# visudo
добавить такую строку:
nonprivuser ALL=(ALL) NOPASSWD: /bin/systemctl restart httpd
сохранить файл и протестировать его:
# su - nonprivuser
$ sudo /bin/systemctl restart httpd
Некоторые первоначальные мысли.
Использование цикла while read
будет медленным по сравнению с использованием, скажем,grep -qv '//'
cat | grep | grep | TR | cut |grep
будет медленным по сравнению с простым использованием sed
.
Не имея реальных данных, трудно сказать, в чем проблема.Итак, давайте изменим задачу. Найдите любую легкую для тестирования альтернативу.
Очевидно, поскольку у меня нет ваших данных, я не проверял это.
Итак, давайте создадим новый скрипт noncomments.sh. Этот вернет строки без комментариев. Это должно быть легко проверить, запустите его на любом файле патча и посмотрите, какие строки без комментариев -он выдает.
#!/bin/sh
# delete the +++ and --- lines from unified diff. remove lines which are not
# added/removed. remove added/removed lines which are comments or blank
# output anything that is left
sed '/^+++/d;/^---/d;/^[+-]/!d;/^.[ \t]*\/\//d;/^.[ \t]*$/d' "$@"
а затем свяжите их вместе
#!/bin/bash
find my/patch/folder -type f
-print0 | xargs -0 sh -c '
for i
do
[ -z "$(./noncomments.sh "$i")" ] || cat "$i"
done
' > small.patch
Перенаправление выполняется только один раз.
Можно было бы еще немного изменить баланс работы, например сделать так, чтобы скрипт ничего не выводил, если изменения касались только комментариев, и весь файл, если изменений комментариев не было. Тогда команда будет просто
find my/patch/folder -type f -exec./noncommentchanges {} \; > small.patch
Такие сценарии в основном представляют собой набор утверждений, которые мы делаем о git разностных данных. И всякий раз, когда мы слышим утверждения, мы используем обходные пути , например, они есть в Perl механизме регулярных выражений.
find my/patch/folder -type f \
-exec perl -lne '
tr/ \t//dr =~
m{(?=^[-+])(?!^([-+])\1{2})(?=^.(?!//))}
and exit 0}{exit 1
' {} \; -exec cat {} + > small.patch
Изучение регулярного выражения:
# delete indiscriminately all spaces n TABs
tr/ \t//dr =~
m{ (?# From where I stand...)
(?=^[-+]) (?# I can see the beginning of line to my immediate eight followed by either a plus or minus sign)
### AND ###
(?!([-+])\1{2}) (?# I donot see --- or +++ string at the beginning of line)
###:AND ###
(?=.(?!//)) (# I donot see // as the 2nd and 3rd characters)
}x;
## so when all 3 assertions are met,
can we say that we have seen a
noncomment commit line and so we
promptly exit with a Unixy success (0)
else we wait till the eof to exit with a
Unixy failure (1)