ฟังก์ชันส่งคืน แต่บล็อกการแทนคำสั่งเนื่องจากคุณสร้างงานพื้นหลัง แต่คุณยังคงเปิด 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
จะปรากฏในคอนโซลของคุณ