為什麼在 bash 中啟動的後台進程會將 stdout 印到螢幕上?

為什麼在 bash 中啟動的後台進程會將 stdout 印到螢幕上?

我很難理解我的情況,谷歌到目前為止也沒有多大幫助。

我開始了 bash 後台工作:

ping google.com &

首先,我取得進程 ID,然後 Bash 將標準輸出列印到螢幕上。

user@host:~$ ping google.com &
[1] 14004
user@host:~$ PING google.com (173.194.44.66) 56(84) bytes of data.
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=1 ttl=54 time=26.3 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=2 ttl=54 time=27.4 ms
64 bytes from ham02s14-in-f2.1e100.net (173.194.44.66): icmp_seq=3 ttl=54 time=29.2 ms
...

這與我今天讀到的所有內容相矛盾。我有一個運行 GNU bash 版本 4.3.30(1)-release (x86_64-pc-linux-gnu) 的標準 Debian Jessie 設定。

誰能向我解釋一下嗎?謝謝。

答案1

預設情況下,至少對於 POSIX 相容系統,在背景執行命令時,&僅使用 detaches stdin,這樣您就可以執行其他命令。stdout並且stderr仍然附著在父親外殼上。

如果您不想看到stdout和/或stderr您可以將它們重定向到檔案或/dev/null

command &>log.txt &                #stdout and stderr to log.txt
command 1>/dev/null &               #stdout to /dev/null, stderr still attached to shell
command 1>output.log 2>error.log &  #stdout to output.log, stderr to error.log

答案2

後台進程的標準輸出是否顯示在終端機上由您決定。您可以使用實用程式更改行為stty

例子

預設允許後台程序寫入終端:

$ echo Hello &
[1] 25850
Hello
$

可以使用以下命令更改該行為stty

$ stty tostop
$ echo Hello &
[2] 25873

[2]+  Stopped                 echo Hello
$ 

如果tostop指定,後台程序在嘗試寫入 stdout 時將停止。如果你想讓它繼續,你可以將它帶回前台:

$ fg
echo Hello
Hello
$

要切換回來,請運行stty -tostop.運行之後,新的建立的後台作業將被允許寫入標準輸出。 (現有工作不會受到影響。)

文件

man stty該選項解釋tostop如下:

* [-]tostop
停止嘗試寫入終端機的後台作業

手冊頁使用上面的前導*來將此選項標識為非 POSIX。

相關內容