Bash
為什麼在後台程序結束之前函式不會返回?
考慮這個腳本:
#!/bin/bash function start { leafpad & echo $! } PID=$(start) echo "PID is $PID"
在leafpad 程序結束之前,腳本不會繼續超過它的右括號,即使它是一個後台程序。
為什麼是這樣?是否可以從函式啟動後台程序?
該函式返回,但命令替換阻塞,因為您創建了一個後台作業,但您的 stdout fd 仍然打開。只需
>/dev/null
在&
.#!/bin/bash function start { leafpad >/dev/null & echo $! } PID=$(start) echo "PID is $PID"
如果您希望您的程序也關閉標準輸入、標準輸出、標準錯誤,請使用以下命令:
leafpad >/dev/null 0>&1 2>&1 &
這將關閉標準輸入 (0)、標準輸出 (1) 和標準錯誤 (2),然後關閉背景 (&)。此外,當使用這些流重定向時,不要忘記它們是“重複的”,這意味著按執行順序重複。
1>/dev/null 2>&1
和
2>&1 1>/dev/null
不一樣!在前者中,您將流複製到 /dev/null(這是您想要的),在後者中,您將 /dev/stdout 複製到 stderr,然後關閉 stdout。因此,發送到的任何消息
stderr
都會出現在您的控制台中。