我很難理解我的情況,谷歌到目前為止也沒有多大幫助。
我開始了 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。