Вы можете просто изменить всю строку, где появляется wal_level
, включая #
и произвольное количество пробелов:
sed '/^# *wal_level/cwal_level = archive' inputfile
Я нашел команду. Подробности в вопросе.
{ sed /"$keywords"/q; kill $!; } < <(exec timeout 1m tail -Fn 0 $log_file)
#!/bin/bash
и set -euxo pipefail
необходимы, если в сценарии, который должен выполняться bash
, а не sh
, хотя и связан с bash
в CentOS.
Вы можете сделать что-то вроде:
sh -c 'echo "$$"; exec tail -f file' | (
IFS= read -r pid
timeout 60 sed "/$keyword/q"
kill -s PIPE "$pid"
)
Если вы не включили опцию pipefail
, она завершится со статусом выхода kill
, который должен быть равен 0, если tail
не вышел сам по себе (, чего на практике быть не должно ).
С pipefail
это приведет к выходу со статусом выхода tail
, уничтоженным SIGPIPE, (который большинство оболочек представляют со значением 141 ). Вы всегда можете добавить || true
, чтобы принудительно завершить статус успешного завершения.
См. также:
Я думаю, что здесь происходит состояние гонки. tail --pid=...
зависит от tail
проверки и осознания того, что отслеживаемый PID умер до того, как он получит SIGPIPE (, обычно сигнал №. 13, что соответствует статусу выхода 128+13=141, который вы получили )при попытке записи в канал, прерванный завершением sed
. В руководстве сказано только, что "вскоре после завершения этого процесса хвост также завершится", поэтому проверка может быть нечастой.
В любом случае, если tail
был убит SIGPIPE, это означает, что (обычно)sed
получил нужную вам линию и вышел, так что также должно быть для вас условием успеха.. И я бы предложил относиться к этому именно так, используя блок if
для защиты от set -e
и явно проверяя статус выхода:
if timeout tail... | sed...; ret=$?; then
: # do nothing, success
elif [ "$ret" != 141 ] # not sigpipe, sed didn't quit, so failure
exit "$ret"
fi
Помимо :, вы сказали, что скрипт использует #/bin/bash
. Это должно быть #!
с восклицательным знаком, а не просто #
. Без этого сценарий будет запускаться с помощью sh, и, возможно, поэтому ваша попытка использовать подстановку процесса(<(...)
— это процесс , а не команда, подстановка )является синтаксической ошибкой. Дважды проверьте это.
Я знаю, вы сказали, что вам нужен один лайнер, но сложный лайнер -не всегда является лучшим решением, когда речь идет о ремонтопригодности. Используйте несколько строк, если это означает, что вам будет проще документировать то, что вы делаете.