Tại sao 'echo $ 0' mang lại kết quả khác nhau cho hai thiết bị đầu cuối khác nhau?


15

Tôi đã mở một thiết bị đầu cuối trên Ubuntu bằng cách sử dụng Ctrl+ Alt+ Tvà một thiết bị đầu cuối khác bằng cách vào một thư mục và sau đó nhấp chuột phải và chọn "Mở trong thiết bị đầu cuối".

Tôi đã làm một echo $0trong cả hai trường hợp.

Trong trường hợp đầu tiên:

$ echo $0
-bash

Trong trường hợp thứ hai:

$ echo $0
/bin/bash

Tại sao có sự khác biệt này?


$ 0 trả về tên của quá trình đang chạy.
Ramesh

Bạn có chạy hai thiết bị đầu cuối với người dùng khác nhau?
cuonglm

Tôi sử dụng cùng một người dùng
CodeBlue 7/214


Chúng thực sự là các trình giả lập thiết bị đầu cuối khác nhau hay chỉ là hai phiên bản của cùng một trình giả lập thiết bị đầu cuối? Cả hai đều là thiết bị đầu cuối mặc định?
terdon

Câu trả lời:


16

Nếu đầu ra của echo $0lệnh là -bashnó có nghĩa là bashđược gọi như một vỏ đăng nhập. Nếu đầu ra là duy nhất bash, thì bạn đang ở trong một vỏ không đăng nhập.

man bash nói đâu đó ở dòng 126:

A  login shell is one whose first character of argument zero is a -, or 
one started with the --login option.

Xem thêm về đây: Sự khác biệt giữa Shell đăng nhập và Shell không đăng nhập? .

Bây giờ, để giải thích lý do tại sao bạn gặp /bin/bashtrường hợp thứ hai, tôi có thể nói rằng một chương trình (trong trường hợp của bạn là trình quản lý tệp của bạn, có thể là nautilus) hoặc một tập lệnh có thể thay đổi chính nó $0thành một chương trình khác. Ví dụ: xem những gì đang xảy ra với $0thiết bị đầu cuối của tôi (cùng một thiết bị đầu cuối mọi lúc):

nhập mô tả hình ảnh ở đây


12

Sự khác biệt là theo cách mà những thứ này đã được bắt đầu. bash sẽ khởi tạo khác nhau (đọc các tập lệnh khởi động khác nhau) tùy thuộc vào nó argv [0]. Nếu chuỗi bắt đầu bằng một dấu gạch nối -như trong -bashthì nó chạy như một vỏ đăng nhập, nếu không, nó sẽ chạy như một vỏ tương tác. Nó cũng có thể chạy như một trình bao không tương tác (ví dụ: trong tập lệnh shell).

Để tìm hiểu thêm, tốt nhất bạn nên đọc hướng dẫn, man bashphần HÓA ĐƠN.


9

Một vỏ được bắt đầu khi bạn đăng nhập, nhưng nó cũng bắt đầu bởi các chương trình như make, hoặc khi bạn chạy một kịch bản shell, hoặc khi bạn gõ :shvào vi, hoặc khi bạn tạo ra một cửa sổ terminal mới.

Ban đầu, shell đọc ~/.profilekhi bạn đăng nhập hoặc chạy su. Kịch bản lệnh này sẽ thực hiện những việc như thông báo xem bạn có email mới hay không, tùy chỉnh xóa và xóa các ký tự, đồng thời thiết lập và xuất các biến TATE và PATH. Khi bắt đầu trong hầu hết các bối cảnh khác, shell không đọc ~/.profile, bởi vì hầu hết những thứ đó sẽ là dư thừa. Bạn đã dự kiến ​​xuất bất kỳ biến shell quan trọng nào sang shell mới.

Cách cái vỏ biết có nên đọc hay không ~/.profilelà để kiểm tra xem ký tự đầu tiên của argv[0], hay còn gọi $0'-'.

Bắt đầu với csh, bí danh đã được giới thiệu. Bí danh không được xuất trong môi trường. cshđược thiết kế để đọc trong hai tập lệnh khởi tạo khác nhau. ~/.loginchỉ được đọc khi người dùng đăng nhập và gợi ý để làm điều này là nếu argv[0]bắt đầu bằng '-'. ~/.cshrcđược đọc mỗi khi vỏ được bắt đầu. Nói chung, một người đặt bí danh ~/.cshrcvà mọi thứ khác trong ~/.login. cshcũng được hỗ trợ ~/.logout, trong hầu hết các trường hợp chỉ cần xóa màn hình và chạy fortune.

Vỏ khác thông qua các tính năng tương tự. kshsẽ đọc ~/.kshrc, bashsẽ đọc ~/.bashrcvà đó là nơi bạn đặt định nghĩa bí danh của mình.

Vì vậy, để làm cho một câu chuyện dài trở nên ngắn gọn, ứng dụng sinh ra một vỏ sẽ quyết định xem nó có phải là "vỏ đăng nhập" hay không, trong trường hợp đó là '-'lúc đầu, hoặc vỏ thông thường. Trong hầu hết các trường hợp, một vỏ sẽ tương tác được bắt đầu như một vỏ đăng nhập và một vỏ có nghĩa là chỉ để chạy một số lệnh, như là đối số hoặc từ một tập lệnh, và sau đó thoát là một vỏ thông thường.

Nhưng tất cả tùy thuộc vào ý thích của ứng dụng khởi động trình bao.

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.