Функция возвращается, но подстановка команды блокируется, потому что вы создали фоновое задание, но у вас все еще открыт stdout fd. Просто закройте его, добавив >/dev/null
перед &
.
#!/bin/bash
function start {
leafpad >/dev/null &
echo $!
}
PID=$(start)
echo "PID is $PID"
Если вы хотите, чтобы у вашего процесса были также закрыты stdin, stdout, stderr, используйте это:
leafpad >/dev/null 0>&1 2>&1 &
Это закроет stdin (0), stdout (1) и stderr (2), затем background (&). Кроме того, при использовании этих потоковых перенаправлений не забывайте, что они «дублированы», то есть дублируются в порядке выполнения.
1>/dev/null 2>&1
а также
2>&1 1>/dev/null
не то же самое! В первом случае вы дублируете поток в / dev / null (что вам и нужно), во втором вы дублируете / dev / stdout в stderr, а затем закрываете stdout. Таким образом, любое отправленное сообщение stderr
появится в вашей консоли.