Hàm trả về, nhưng khối thay thế lệnh, bởi vì bạn đã tạo một công việc nền, nhưng bạn vẫn mở fdout stdout của mình. Chỉ cần đóng nó bằng cách thêm >/dev/null
trước &
.
#!/bin/bash
function start {
leafpad >/dev/null &
echo $!
}
PID=$(start)
echo "PID is $PID"
Nếu bạn muốn tiến trình của mình cũng có stdin, stdout, stderr đã đóng, hãy sử dụng điều này:
leafpad >/dev/null 0>&1 2>&1 &
Điều này sẽ đóng stdin (0), stdout (1) và stderr (2), sau đó là nền (&). Ngoài ra, khi sử dụng các chuyển hướng luồng này, đừng quên chúng bị "lừa", điều đó có nghĩa là trùng lặp theo thứ tự thực hiện.
1>/dev/null 2>&1
và
2>&1 1>/dev/null
không giống nhau ! Trước đây, bạn đang sao chép một luồng thành / dev / null (đó là những gì bạn muốn), sau đó, bạn đang sao chép / dev / stdout thành stderr, và sau đó, đóng stdout. Vì vậy, bất kỳ tin nhắn được gửi đến stderr
sẽ xuất hiện trong bảng điều khiển của bạn.