Làm thế nào để ẩn thông tin quá trình shell khi bắt đầu quá trình nền?


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

Làm thế nào để tôi / dev / null hai tin nhắn này?:

[1] 5232
[1]+  Done                    sleep 3

ps: vì vậy tôi cần đầu ra của quá trình, nhưng không phải là hai dòng được đề cập!


Bạn chỉ nhận được những dòng đó khi bạn chạy nó một cách tương tác. Bạn không nên nếu bạn chạy nó từ một kịch bản, ví dụ.
derobert

Câu trả lời:


24

Đây không phải là đầu ra của chương trình, đây là một số thông tin hữu ích.

Dù sao, những người có thể được ẩn bằng cách sử dụng chuyển hướng con và chuyển hướng đầu ra

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

2
"2> / dev / null" là điều tốt, tôi cần đầu ra từ quy trình
LanceBaynes

@LanceBaynes Quá trình cũng có thể viết một cái gì đó trên stderr.
Chris Xuống

2
Thật không may khi điều này đánh bại việc thu hồi pid với $!
Deleplace

3

Trong bash hoặc zsh, bạn có thể gọi disown %1để nói với shell để quên công việc. Sau đó, shell sẽ không in bất kỳ thông báo nào về công việc đó, và nó cũng sẽ không hiển thị nó khi bạn chạy jobshoặc đã từng gửi SIGHUP cho nó. Trong zsh, bắt đầu công việc &!thay vì &tương đương với việc gọi disownnó ngay lập tức.


1

Không thể nhận xét (chưa) trên @Gilles nhưng có vẻ như nó & disowncũng hoạt động trong bash:

sleep 3 & disown

Điều này dường như không hoạt động trong Bash v.4.1.2
Alexej Magura

1

Thử:

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

Và bạn đã ẩn cả đầu raPID . Lưu ý rằng bạn vẫn có thể truy xuất PID từ $ REPLY

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.