~ là $ HOME, nhưng đôi khi?


14

cd ~

làm điều tương tự như

cd $HOME

cũng giống như

cd /home/tandu

Tuy nhiên,

cd ~not-tandu

thay đổi /home/not-tandu

Đây hoàn toàn là một sự lựa chọn cú pháp? Làm thế nào điều này được xử lý bởi kernel (hoặc thực cdthi?) Có trường hợp đặc biệt nào ~để thêm dấu gạch chéo nếu mọi thứ khác bị bỏ qua không? Đó là để nói, ~/~thay đổi vào cùng một thư mục, nhưng ~alà một thư mục lên. Điều tương tự không thể được nói cho bất kỳ thư mục khác mà bạn thay đổi.


3
Vui lòng so sánh ~ not-tandu và ~ / not-tandu, một điểm cho thư mục nhà không-tandu của người dùng và các điểm khác với dir không-tandu trong homedir của bạn.
Johan

4
Nó không phải là kernel hay "cd thực thi" (vì không có thứ đó) - nó là một shell được tích hợp sẵn.
Paul Tomblin

Vì bạn không đề cập đến nó: cdkhông có bất kỳ tham số nào hoạt động như thế nào cd ~. Nếu bạn thay thế cdbằng echobạn có thể thấy biểu thức được mở rộng bởi shell.
jofel

Câu trả lời:


18

~là một bí danh $HOMEđược cung cấp bởi một số vỏ, nhưng $HOMEphổ quát hơn. $HOMEthực sự yêu cầu shell chèn (thay thế) biến môi trường HOME ở đây. Có khá nhiều biến môi trường khác nhau có thể được thay thế, hãy thử chạy envcho một danh sách. Lưu ý rằng ~không phải lúc nào cũng được nhận ra khi nó không ở đầu từ. Hãy thử hai lệnh này để so sánh:

ls /~
ls /$HOME

Cái đầu tiên được truyền cho ls thực thi khi /~nó cố gắng xem một tệp được gọi ~trong thư mục gốc, cái thứ hai mở rộng $HOME//home/usersau đó được chuyển đến ls thực thi như một đối số dòng lệnh. Tất cả các hệ thống POSIX (POSIX là tiêu chuẩn cho cách các hệ thống UNIX và Linux hoạt động) cho phép nhiều dấu gạch chéo được xử lý giống như một dấu gạch chéo //home/usergiống như nói /home/user. ~usernamelà một phím tắt để báo cho shell tìm kiếm tên người dùng trong tệp passwd và trả về thư mục chính của họ. Không có biến môi trường tương đương. Tất cả các thay thế này được thực hiện bởi shell và được hỗ trợ bởi hầu hết trong số chúng, nhưng chỉ các biến môi trường như $HOMEđược đảm bảo sẽ được hỗ trợ bởi tất cả các shell. Cũng thế,cdthực sự là một lệnh tích hợp. Đó là một lệnh đặc biệt bảo chính shell thay đổi thư mục. Nó không giống như các trình dựng sẵn shell khác có thể được triển khai như một thực thi riêng biệt giống như echovì nó được sử dụng để thay đổi một thuộc tính cơ bản của quy trình shell. echochỉ đơn thuần là một vỏ được tích hợp sẵn vì lý do hiệu năng, nhưng trong những ngày tốt đẹp của UNIX, chỉ có sẵn khi nó có thể thực thi được /bin/echo.


re "mà sau đó cố gắng xem xét một tệp có tên ~ trong thư mục gốc"; Đó là cho tất cả các hương vị unix?
Pacerier

17

~foo có nghĩa là 'thư mục chính của người dùng foo'.

Điều này không được thực hiện bởi kernel, nó được giải thích bởi shell. Bất cứ khi nào shell nhìn thấy ~foonhư một đối số, nó sẽ thay thế nó một cách minh bạch bằng thư mục chính của người dùng foovà chuyển nó vào vị trí của nó. Vì vậy, khi bạn chạy cd ~tandu, vỏ thực sự đang chạy cd /home/tandu.


1
Điều gì đặc biệt không thay thế này và với thuật toán gì? Là nó cdhay vỏ? Nếu bạn không chạy shell thì sao? Có phải là một "nếu ~ được theo sau bởi một cái gì đó, mở rộng khác nhau?" hoặc có một số xử lý đặc biệt khác cho điều kiện độc đáo này?
Vụ nổ gây ra

8
Xem hướng dẫn Bash về Mở rộng Tilde . (Nhiều shell và chương trình khác tuân theo các quy tắc tương tự.)
cjm 17/03/2016

4
@tandu: shell không cd, không có khả năng thực thi bên ngoài để làm điều đó (điều đó là không thể)
Mat

1
@tandu: nếu bạn không chạy shell (ví dụ: dùng thử exec(2)), việc mở rộng shell không diễn ra. Nếu không mở rộng hệ vỏ, ~sẽ không bị thay thế bởi bất cứ điều gì - đó chỉ là một nhân vật hoàn toàn hợp lệ. Điều này cắn tôi trong những ngày đầu SunOS của tôi vì /bin/shđã không mò mẫm ~.
Alexios

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.