Đầu tiên; một khi bạn đã bắt đầu một quá trình, bạn có thể nền nó bằng cách trước tiên dừng nó (nhấn Ctrl- Z) và sau đó gõ bg
để cho nó tiếp tục trong nền. Bây giờ nó là một "công việc" và stdout
/ stderr
/ stdin
vẫn được kết nối với thiết bị đầu cuối của bạn.
Bạn có thể bắt đầu một quy trình làm nền ngay lập tức bằng cách thêm "&" vào cuối của nó:
firefox &
Để chạy nó trong nền im lặng, sử dụng:
firefox </dev/null &>/dev/null &
Một số thông tin bổ sung:
nohup
là một chương trình bạn có thể sử dụng để chạy ứng dụng của mình sao cho thiết bị xuất chuẩn / stderr của nó có thể được gửi đến một tệp thay vào đó và việc đóng tập lệnh gốc sẽ không SIGHUP cho trẻ. Tuy nhiên, bạn cần có tầm nhìn xa để sử dụng nó trước khi bạn khởi động ứng dụng. Do cách thức nohup
hoạt động, bạn không thể chỉ áp dụng nó cho một quy trình đang chạy .
disown
là một bash dựng sẵn để loại bỏ một công việc shell khỏi danh sách công việc của shell. Điều này về cơ bản có nghĩa là bạn không thể sử dụng fg
, bg
trên đó nữa, nhưng quan trọng hơn, khi bạn đóng vỏ của mình, nó sẽ không bị treo hoặc gửi SIGHUP
cho đứa trẻ đó nữa. Không giống như nohup
, disown
được sử dụng sau khi quá trình đã được đưa ra và nền.
Những gì bạn không thể làm, là thay đổi thiết bị xuất chuẩn / stderr / stdin của một quy trình sau khi đã khởi chạy nó. Ít nhất không phải từ vỏ. Nếu bạn khởi chạy tiến trình của mình và nói với nó rằng thiết bị xuất chuẩn của nó là thiết bị đầu cuối của bạn (đó là những gì bạn làm theo mặc định), thì quá trình đó được cấu hình để xuất ra thiết bị đầu cuối của bạn. Shell của bạn không có tác dụng với thiết lập FD của các quy trình, đó hoàn toàn là thứ mà chính quy trình đó quản lý. Quá trình tự nó có thể quyết định có đóng stdout / stderr / stdin của nó hay không, nhưng bạn không thể sử dụng trình bao của mình để buộc nó làm như vậy.
Để quản lý đầu ra của quy trình nền, bạn có rất nhiều tùy chọn từ các tập lệnh, "nohup" có lẽ là người đầu tiên nghĩ đến. Nhưng đối với các quá trình tương tác, bạn bắt đầu nhưng quên im lặng ( firefox < /dev/null &>/dev/null &
) bạn thực sự không thể làm được gì nhiều.
Tôi khuyên bạn nên lấy GNU screen
. Với màn hình, bạn chỉ có thể đóng vỏ đang chạy khi đầu ra của quá trình trở nên phiền phức và mở một cái mới ( ^Ac
).
Ồ, và nhân tiện, đừng sử dụng " $@
" nơi bạn đang sử dụng nó.
$@
có nghĩa là, $1
, $2
, $3
..., mà sẽ chuyển lệnh của bạn vào:
gnome-terminal -e "vim $1" "$2" "$3" ...
Đó có lẽ không phải là điều bạn muốn bởi vì - chỉ cần một đối số. Sử dụng $1
để chỉ ra rằng tập lệnh của bạn chỉ có thể xử lý một đối số.
Thật sự rất khó để có nhiều đối số hoạt động chính xác trong kịch bản mà bạn đã đưa ra (với gnome-terminal -e
) vì -e
chỉ lấy một đối số, đó là một chuỗi lệnh shell. Bạn sẽ phải mã hóa các đối số của mình thành một. Cách tốt nhất và mạnh mẽ nhất, nhưng khá vụng về, là như vậy:
gnome-terminal -e "vim $(printf "%q " "$@")"