Bash

為什麼在後台程序結束之前函式不會返回?

  • July 26, 2015

考慮這個腳本:

#!/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都會出現在您的控制台中。

引用自:https://unix.stackexchange.com/questions/218515