Что ж, записать stderr в одну переменную и stdout в другую переменную без временного файла совсем непросто.
Вот пример, который работает
func() {
echo 'hello'
echo 'This is an error' >&2
}
result=$(
{ stdout=$(func) ; } 2>&1
echo -e "mysuperuniqueseparator\n"
echo -e "${stdout}\n"
)
var_out=${result#*mysuperuniqueseparator$'\n'}
var_err=${result%$'\n'mysuperuniqueseparator*}
Меня это не устраивает, потому что это грязный способ, перенаправить stderr на stdout и поместить оба в одну переменную с разделителем между ними, а затем разбить его на две части.
Плюс:
Obviously, this is not robust, because either the standard output or the standard error of the command could contain whatever separator string you employ.
Взято отсюдаhttp://mywiki.wooledge.org/BashFAQ/002
Хитрость заключается в том, чтобы убедиться, что вы убиваете правильный процесс и только те, которые вам нужны. Звучит просто, но так много людей заблуждаются. Худший программный способ - сделать это по имени.
Итак, вы сказали, что не можете изменить родителя. Правильный способ, если бы вы могли это сделать, - это взять возвращаемое значение вызова fork (), поскольку он имеет дочерний PID. PID уникален, а имя (, которое, я думаю, вы делаете с ps aux | grep )не уникален.
Предполагая, что вы знаете PID родителя, pgrep -P может быть одним из способов сделать это. Это предполагает, что у вас есть один дочерний процесс, поскольку он будет соответствовать всем дочерним процессам родителя.
Как ни странно, killall соответствует возрасту, pgrep/pkill соответствует родительскому, но они не делают то, что делает другой; что-то исправить однажды, возможно.