Bạn có thể sử dụng .exec ./your-script
Trình giả lập thiết bị đầu cuối như Gnome Terminal thoát khi quá trình ban đầu chạy bên trong nó - thường là trình bao - thoát.
Nếu bạn đã ở trong một thiết bị đầu cuối và điều duy nhất bạn muốn làm trước khi thoát thiết bị đầu cuối đó là chạy một tập lệnh (hoặc chương trình) cụ thể, thì điều này có nghĩa là bạn không còn thực sự cần cái vỏ đang chạy trong đó nữa. Do đó, bạn có thể sử dụng hàm exec
dựng sẵn của shell để làm cho shell tự thay thế bằng quy trình được tạo bởi lệnh của bạn.
- Trong trường hợp tập lệnh của bạn, đó là một quy trình shell khác - giống như cách quy trình shell thứ hai được tạo khi bạn chạy tập lệnh mà không có
exec
.
Cú pháp là , ví dụ , .exec command
exec ./your-script
exec
: một ví dụ
Ví dụ: giả sử tôi có một tập lệnh shell được gọi count
, được đánh dấu thực thi và nằm trong thư mục hiện tại. Nó chứa:
#!/usr/bin/env bash
for i in {5..1}; do echo $i; sleep 1; done
Và, trong một thiết bị đầu cuối, tôi chạy:
exec ./count
Đây in các chữ số 5
, 4
, 3
, 2
, và 1
, mỗi thứ hai, và sau đó đóng cửa sổ terminal.
Nếu bạn chạy cái này từ một cái gì đó khác với quy trình đầu tiên chạy trong thiết bị đầu cuối của bạn - ví dụ, nếu bạn chạy bash
trước để bắt đầu một phiên bản shell khác - thì điều này sẽ đưa bạn trở lại trình bao đã tạo ra quy trình đó , thay vì thoát khỏi thiết bị đầu cuối. (Thông báo trước này áp dụng như nhau cho exit
các phương pháp dựa trên.)
Bạn có thể sử dụng ../your-script; exit
Nếu bạn không muốn bảo trình bao của mình thay thế chính nó bằng quy trình mới (thông qua exec
), bạn có thể bảo nó bám xung quanh nhưng tự thoát ra ngay sau khi quy trình mới kết thúc.
Để làm điều này, hãy chạy lệnh của bạn và exit
lệnh, cách nhau ;
để chúng có thể được cung cấp trên một dòng.
Cú pháp là command; exit
, ví dụ , ../your-script; exit
command; exit
so với command && exit
Bạn có thể nhận thấy điều này trông tương tự như phương pháp được đề xuất trong câu trả lời của kos và heemayl . Sự khác biệt là:./your-script && exit
&&
chỉ chạy lệnh thứ hai nếu lệnh đầu tiên báo cáo rằng nó đã thành công bằng cách trả về mã thoát bằng không.
;
chạy lệnh thứ hai bất kể lệnh đầu tiên có báo cáo thành công hay không.
Cái nào bạn muốn phụ thuộc vào tình hình cụ thể. Nếu lệnh thất bại, bạn có muốn shell gọi (và thiết bị đầu cuối lưu trữ) ở lại không? Nếu vậy, sử dụng &&
; nếu không, sử dụng ;
.
Ngoài ra command || exit
, cũng chỉ thoát khỏi vỏ gọi nếu command
báo cáo thất bại .