Câu hỏi Tại sao một số chương trình trở lại khi được gọi từ thiết bị đầu cuối trong khi các chương trình khác chỉ trả lại bằng cách bao gồm '&'


Các chương trình như Skype và Tixati chỉ có thể được gọi từ thiết bị đầu cuối mà không cần thêm & vào cuối cuộc gọi của họ. Tại sao điều này không đúng với Firefox. Tôi chỉ tò mò về những chương trình tôi cần để thêm & tùy chọn.


5
2018-06-14 10:22


gốc


Tôi nghi ngờ có một cách để biết chương trình nào cần &, ngoại trừ dùng thử và lỗi - Sergiy Kolodyazhnyy
Ngoài ra firefox hoạt động tốt, & là chạy các lệnh trong nền - Ron
Unetbootin cũng vậy. - DK Bose


Các câu trả lời:


Điều này phụ thuộc hoàn toàn vào cách phần mềm được viết, thường cũng phụ thuộc vào ý định với nó.

Hầu hết các tiện ích bash (= shell, terminal) có nghĩa là được sử dụng "đồng bộ", với việc thực thi này có nghĩa là tạo ra một kết quả; có thể được yêu cầu cho các lệnh sau trong một kịch bản hoặc thủ tục thủ công - nếu tiện ích (chương trình, phần mềm) tách và để lại dấu nhắc ngay lập tức, bạn sẽ không biết khi nào hoặc nếu kết quả có sẵn.

Skype thường không được sử dụng như một dòng lệnh "tiện ích" mà là một công cụ để xử lý giao tiếp (điện thoại hoặc bất cứ thứ gì). Và sau đó nó là khá tiện dụng nếu nó không chặn các thiết bị đầu cuối, nếu đưa ra từ đó.

Tách ra khỏi thiết bị đầu cuối:
https://superuser.com/questions/178587/how-do-i-detach-a-process-from-terminal-entirely


13
2018-06-14 10:30





Tất cả các chương trình có thể được gọi mà không cần &. Các & là hoàn toàn tùy chọn. Tất cả những gì nó làm là gửi quá trình đến nền để bạn có thể tiếp tục sử dụng thiết bị đầu cuối của mình.

Nếu không có nó, nếu bạn khởi động một quá trình từ thiết bị đầu cuối, bạn sẽ cần phải đợi cho đến khi quá trình đó kết thúc (hoặc bị đóng) trước khi có thể tiếp tục sử dụng thiết bị đầu cuối của bạn. Do đó, một chương trình thường chạy command & để gửi chúng lên nền và tiếp tục làm việc trong cùng một thiết bị đầu cuối.

Để biết thêm về các toán tử shell khác nhau như & và những gì họ làm, xem đây.


9
2018-06-14 10:34



Yeah nhưng giống như câu trả lời trước đó cho biết, chương trình không cần phải được gửi đến nền nếu nó được tách ra từ thiết bị đầu cuối. - Sharan Duggirala
@SharanDuggirala thêm một & (hoặc Ctrl + Z và bg) hoặc tách, sử dụng at, nohup, hoặc là disown, tất cả đều có cùng tác dụng bề ngoài: chúng sẽ trả về thiết bị đầu cuối của bạn cho bạn bằng cách chạy chương trình ở chế độ nền. Mỗi cách tiếp cận có những lợi ích khác nhau nhưng không có yêu cầu nào và tất cả gửi quá trình tới nền. - terdon♦
Nhưng dù sao, tôi đã tìm kiếm các nhà khai thác để sử dụng trong một thiết bị đầu cuối - Sharan Duggirala


Nó là rất đơn giản cho một chương trình để đặt chính nó trong nền. Mã được sử dụng để làm như vậy có thể đơn giản như sau:

if (fork() > 0) _exit(0);

Nhưng làm như vậy theo mặc định sẽ giới thiệu một vài nhược điểm. Ví dụ bạn không còn có thể bọc chương trình trong một kịch bản mà làm một cái gì đó khi chương trình chấm dứt. Và đầu ra bằng văn bản cho thiết bị đầu cuối từ quá trình nền có thể kết thúc trông khá lộn xộn, đầu ra của thiết bị đầu cuối từ quá trình nền có thể bị tắt nhưng sau đó quá trình nền sẽ bị đóng băng khi nó cố gắng tạo ra đầu ra.

Theo kinh nghiệm của tôi, Skype và Firefox không tự đặt mình ở chế độ nền. Họ làm một cái gì đó khác nhau mặc dù.

Khi bạn bắt đầu một trong các chương trình này, họ sẽ kiểm tra xem đã có một phiên bản chạy chương trình chưa. Nếu có một cá thể đang chạy, cá thể mới sẽ gửi một thông báo đến cá thể đang chạy với tham số bạn vừa cho nó, và sau đó thoát.

Hiệu ứng của điều đó là cá thể đang chạy thực hiện điều gì đó và bạn sẽ nhận được lời nhắc của mình.


3
2018-06-15 06:37



+1. Ngoài ra, bạn thường có thể yêu cầu các chương trình này không tìm kiếm các phiên bản khác của chính chúng, ví dụ: với skype --secondary hoặc là firefox --new-instance. Nếu bạn làm điều đó, mà không sử dụng &, họ nên luôn chặn thiết bị đầu cuối cho đến khi bạn thoát chúng. - Ilmari Karonen