Используйте негативный взгляд -вперед в Perl:
perl -ne 'print unless /#(?!!)/'
Это удаляет строки, содержащие #
, за которыми не следует !
. Если вы хотите сопоставить #только в начале строки, возможно, с предшествующим пробелом, используйте
perl -ne 'print unless /^\s*#(?!!)/'
Вы пробовали переключатель -q
? Он подавляет сообщения об ошибках, отличных от -.
rsync -q user@server:source target
Возможно, сообщение Could not chdir to home directory
является ошибкой.
Это не функция rsync
, как видно из аналогичного сценария(nohome
— это созданная мной учетная запись, не имеющая домашнего каталога):
ssh nohome@localhost date
nohome@localhost's password:
Could not chdir to home directory /dev/null: Not a directory
Thu 1 Aug 07:02:05 UTC 2019
Я не могу найти способ подавить это сообщение(ssh -q
и rsync -q
оба не имеют соответствующего эффекта ).
Что касается rsync
, он даже не видит это сообщение. Статус выхода из rsync
— УСПЕХ (0 ), если все элементы успешно переданы -независимо от отсутствия домашнего каталога:
touch /tmp/x
rsync -av nohome@localhost:/tmp/x /tmp/y; echo Status=$?
nohome@localhost's password:
Could not chdir to home directory /dev/null: Not a directory
receiving incremental file list
x
sent 43 bytes received 83 bytes 50.40 bytes/sec
total size is 0 speedup is 0.00
Status=0
Хорошо, я сам только что нашел решение:
if ! output=$(rsync user@server:source target 2>&1); then
echo "$output"
fi
Вывод (stdout и stderr )сохраняется в переменной, которая выводится только в том случае, если код выхода не равен 0.
Не уверен, что есть лучший способ, но этот определенно работает для меня.
Фон
Пользователь на самом деле является учетной записью компьютера, а фактический rsync
вызывается через скрипт-оболочку, который принимает файл(/etc/machine.secret
)в качестве пароля. Сам скрипт запускается через cron
, поэтому мне пришлось найти способ получать почту тогда и только тогда, когда что-то пойдет не так.
Бездействие означает, что я получаю это сообщение об ошибке каждый раз, когда вызывается скрипт, выполнение довольно простого 2>/dev/null
означает, что я вообще не получаю никаких сообщений об ошибках, поэтому мне пришлось найти способ отфильтровать их. это конкретное сообщение.