тройник висит в bash - есть ли альтернативный синтаксис? - PullRequest
0 голосов
/ 06 июня 2018

Допустим, у вас есть ряд сценариев, которыми вы не владеете и, следовательно, не можете изменять, которые могут порождать фоновые процессы без перенаправления stdout и stderr.Я заметил, что в bash, то есть вывод, как показано в следующем примере, не возвращается, когда скрипт выполняется, если фоновый процесс все еще выполняется (и имеет дескрипторы открытых файлов для stdout или stderr).

./runme.sh 2>&1| tee runme.out

Где runme.sh определяется как:

#!/bin/bash
# Start a fake daemon
perl -e 'while(1) { sleep(1) }' &
printf "Enter your name: "
read name
echo "Goodbye $name"

Как я могу запускать подобные сценарии в bash, сохраняя все выходные данные и возвращаясь к приглашению после завершения сценария?

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

не возвращается, когда скрипт выполнен, если фоновый процесс все еще выполняется (и имеет дескрипторы открытых файлов для stdout или stderr)

Так что не делайте этого.По этой причине инструменты-демоны обычно перенаправляют stdout / err, и вы можете сделать это также вручную:

perl -e 'while(1) { sleep(1) }' < /dev/null  > mydaemon.log 2>&1 &

Теперь, когда канал не открыт, вы можете tee надежно без взломов.

0 голосов
/ 06 июня 2018

альтернативным синтаксисом может быть использование подстановки процесса

./runme.sh > >(tee runme.out) 2>&1

таким образом tee больше не является дочерним процессом текущей оболочки, и оболочка будет ожидать только завершения runme.sh, тогда как в конвейере она ожидаетдля всех процессов завершения.

Обратите внимание, что tee и подпроцессы все еще работают после завершения runme.sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...