จะซ่อนข้อมูลกระบวนการเชลล์เมื่อเริ่มกระบวนการพื้นหลังได้อย่างไร


19
[USER@SERVER ~] sleep 3 &
[1] 5232
[USER@SERVER ~] 
[1]+  Done                    sleep 3
[USER@SERVER ~] 

ฉัน / dev / null ทั้งสองข้อความได้อย่างไร:

[1] 5232
[1]+  Done                    sleep 3

ps: ดังนั้นฉันต้องการผลลัพธ์ของกระบวนการ แต่ไม่ใช่สองบรรทัดที่กล่าวถึง!


คุณจะได้รับสายเหล่านั้นเมื่อคุณเรียกใช้มันแบบโต้ตอบ คุณทำไม่ได้ถ้าคุณเรียกใช้จากสคริปต์ตัวอย่างเช่น
Derobert

คำตอบ:


24

ไม่ใช่เอาต์พุตของโปรแกรมเป็นข้อมูลเชลล์ที่มีประโยชน์

อย่างไรก็ตามสิ่งเหล่านั้นสามารถถูกซ่อนได้โดยใช้การเปลี่ยนเส้นทางย่อยและเอาท์พุท

( sleep 3 & ) > /dev/null 2>&1

2
"2> / dev / null" เป็นสิ่งที่ดีฉันต้องการผลลัพธ์จากกระบวนการ
LanceBaynes

@ LanceBaynes กระบวนการนี้สามารถเขียนบางอย่างลงใน stderr
Chris Down

2
มันโชคร้ายที่สิ่งนี้เอาชนะการดึงหมายเลข pid ด้วย $!
Deleplace

3

ใน bash หรือ zsh คุณสามารถโทรหาdisown %1เพื่อบอก shell เพื่อลืมงาน จากนั้นเชลล์จะไม่พิมพ์ข้อความใด ๆ เกี่ยวกับงานนั้นและจะไม่แสดงเมื่อคุณเรียกใช้jobsหรือเคยส่ง SIGHUP ไปที่มัน ใน zsh การเริ่มต้นงานด้วย&!แทนที่จะ&เป็นการเทียบเท่ากับการเรียกdisownมันทันที


1

ไม่สามารถแสดงความคิดเห็น (ยัง) บน @Gilles แต่ดูเหมือนว่า& disownยังใช้งานได้ในทุบตี:

sleep 3 & disown

ดูเหมือนจะไม่ทำงานใน Bash v.4.1.2
Alexej Magura

1

ลอง:

user@host:~$ read < <( sleep 10 & echo $! )
user@host:~$ echo $REPLY
28677

และคุณได้ซ่อนทั้งการส่งออกและPID โปรดทราบว่าคุณยังสามารถดึงPID ได้จาก $ REPLY

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.