Функція повертається, але заміна блокує команду, оскільки ви створили фонове завдання, але у вас все-таки відкрито 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), а потім фон (&). Крім того, використовуючи ці перенаправлення потоку , не забувайте, що вони "дупіровані", це означає, що вони дублюються в порядку виконання.
1>/dev/null 2>&1
і
2>&1 1>/dev/null
не однакові! У першому ви дублюєте потік в / dev / null (що саме ви хочете), в другому ви дублюєте / dev / stdout в stderr, а потім, закриваючи stdout. Тож будь-яке повідомлення, надіслане на stderr
, з’явиться у вашій консолі.