Ý nghĩa của dấu ngã trong Linux bash (không phải thư mục chính)


106

Trước hết, tôi biết đó ~/là thư mục chính. Đĩa CD đến ~hoặc ~/đưa tôi đến thư mục chính.

Tuy nhiên, cd ~Xđưa tôi đến một nơi đặc biệt, nơi Xdường như là bất cứ thứ gì.

Trong bash, nếu tôi nhấn " cd ~" và nhấn tab, nó sẽ hiển thị một loạt các ~Xtùy chọn khả thi như ~mail~postgres~ssh. Đi đến các thư mục đó và thực hiện pwdcho tôi thấy rằng các thư mục này không có trong thư mục chính; chúng ở khắp nơi.

Họ không phải là bí danh. Tôi đã kiểm tra. Chúng không phải là env.biến, nếu không chúng sẽ yêu cầu một $.

Thiết lập các liên kết này là gì và tôi có thể tìm thấy những liên kết này ở đâu?


~ X chỉ đơn giản trả về chữ "~ X" nhưng ~ trả về $ HOME và ~ + trả về $ PWD - chúng không đặc biệt ngoài việc chúng tìm nạp các biến shell. tức là chúng không lưu trữ các giá trị hoặc thực hiện một lệnh để tra cứu chúng. Chúng đã được xác định. Bạn đã thử ~ -? Tôi không thể nghĩ ra một sử dụng cho nó, nhưng một lần nữa, nó sẽ trả về một biến shell $ OLDPWD
SDsolar

Câu trả lời:


71

Đó là một tính năng Bash được gọi là " mở rộng dấu ngã ". Đó là một chức năng của shell, không phải hệ điều hành. Ví dụ, bạn sẽ nhận được các hành vi khác nhau với csh.

Để trả lời câu hỏi của bạn về nguồn thông tin đến từ đâu: thư mục chính của bạn đến từ biến $HOME(bất kể bạn lưu trữ gì ở đó), trong khi nhà của người dùng khác được truy xuất theo thời gian thực bằng cách sử dụng getpwent(). Chức năng này thường được kiểm soát bởi NSS ; vì vậy các giá trị mặc định được lấy ra /etc/passwd, mặc dù nó có thể được cấu hình để truy xuất thông tin bằng bất kỳ nguồn nào mong muốn, chẳng hạn như NIS, LDAP hoặc cơ sở dữ liệu SQL.

Mở rộng dấu ngã không chỉ là tra cứu thư mục chính. Đây là một bản tóm tắt:

~              $HOME
~fred          (freds home dir)

~+             $PWD       (your current working directory)
~-             $OLDPWD    (your previous directory)
~1             `dirs +1`
~2             `dirs +2`
~-1            `dirs -1`

dirs~1, ~-1v.v., được sử dụng cùng với pushdpopd.


như một lưu ý không hỗ trợ bất kỳ cái nào trong số đó ngoại trừ dấu ngã đơn giản (~)

tại sao họ nghĩ ra ~+? có vẻ khá vô dụng.
cregox

3
~ + gần giống với. Tuy nhiên, để sử dụng một cái gì đó như ./file, nó phải vào hệ thống tệp và tìm ra nơi. được định vị - phải mất một vài chu kỳ. Sử dụng ~ + giúp nó tiết kiệm công việc bằng cách trả về nội dung của biến shell $ PWD đã được xác định khi bạn duyệt qua hệ thống tệp.
SDsolar

32

Đó là các thư mục chủ của người dùng. Hãy thử cd ~(your username), chẳng hạn.


1
Chúng không phải là liên kết tượng trưng, ​​tài khoản dịch vụ không có thư mục chính trong / home
Ana Betts

Câu trả lời tốt nhất trong trường hợp của tôi. Ngoài ra, trong trường hợp cụ thể của tôi, đó là thư mục / thư mục gốc, không phải thư mục chính.
wlwl2

16

Họ có phải là thư mục chính của người dùng trong /etc/passwdkhông? Các dịch vụ như postgres, sendmail, apache, v.v., tạo ra người dùng hệ thống có thư mục chính giống như người dùng bình thường.


2
Trên thực tế họ là ~ username là thư mục home của người sử dụng quy định
Steve weet

14

Đó là những người dùng. Kiểm tra của bạn /etc/passwd.

cd ~username đưa bạn đến thư mục chính của người dùng đó.


FTW. Ủng hộ. TNX để giải tỏa điều đó. Tôi tự hỏi có bao nhiêu chu kỳ và có lẽ thậm chí một vỏ con có liên quan đến chu kỳ đó. Chỉ cần tưởng tượng nếu hệ thống của bạn có 3K người dùng, giống như tại một ISP nhỏ. Rất tiếc.
SDsolar

9

Trên máy của tôi, do cách tôi thiết lập mọi thứ, đang làm:

cd ~             # /work1/jleffler
cd ~jleffler     # /u/jleffler

Đầu tiên chú ý đến giá trị của biến môi trường $HOME; Tôi đã cố tình đặt của mình $HOMEthành hệ thống tệp cục bộ thay vì hệ thống tệp được gắn NFS. Lần thứ hai đọc từ tệp mật khẩu (khoảng; NIS làm phức tạp mọi thứ một chút) và thấy rằng tệp mật khẩu cho biết thư mục chính của tôi là gì /u/jlefflervà thay đổi thành thư mục đó.

Điều khó chịu là hầu hết phần mềm hoạt động như trên (và đặc tả POSIX cho shell yêu cầu hành vi này). Tôi sử dụng một số phần mềm (và tôi không có nhiều lựa chọn về việc sử dụng nó) xử lý thông tin từ tệp mật khẩu là giá trị hiện tại của $ HOME, điều này là sai.

Áp dụng điều này cho câu hỏi - như những người khác đã chỉ ra, ' cd ~x' đi đến thư mục chính của người dùng 'x' và nói chung, bất cứ khi nào mở rộng dấu ngã được thực hiện, ~xcó nghĩa là thư mục chính của người dùng 'x' (và đó là một lỗi nếu người dùng 'x' không tồn tại).


Điều đáng nói là:

cd ~-       # Change to previous directory ($OLDPWD)
cd ~+       # Change to current directory ($PWD)

Tôi không thể tìm thấy cách sử dụng ngay lập tức cho ' ~+', trừ khi bạn làm một số việc kỳ lạ với việc di chuyển các liên kết tượng trưng trong đường dẫn đến thư mục hiện tại.

Bạn cũng có thể làm:

cd -

Điều đó có nghĩa là giống như ~-.


1
Giới thiệu cd ~+: bạn có thể sử dụng nó để kiểm tra xem thư mục mà bạn hiện đang ở có còn tồn tại hay không - ngay cả khi đó là một cách làm không chính thống.
professorsloth


1

Nếu bạn đang sử dụng autofsthì bản mở rộng thực sự có thể đến từ /etc/auto.home(hoặc tương tự cho bản phân phối của bạn). Ví dụ, /etc/auto.masterngoại hình của tôi như sau:

/home2 auto.home --timeout 60

/etc/auto.hometrông giống như:

mgalgs -rw,noquota,intr space:/space/mgalgs

0

Có thể bạn đang thấy người dùng OpenDirectory / ActiveDirectory / LDAP được "tự động tính" vào thư mục chính của bạn.

Trong * nix, ~sẽ phân giải thành thư mục chính của bạn. Tương tự như vậy ~Xsẽ giải quyết thành 'người dùng X'.

Tương tự như tự động tính toán cho các thư mục, OpenDirectory / ActiveDirectory / LDAP được sử dụng trong môi trường lớn hơn / công ty để tự động tính toán thư mục người dùng. Những người dùng này có thể là người thực tế hoặc họ có thể là tài khoản máy được tạo để cung cấp các tính năng khác nhau.

Nếu bạn nhập, ~Tabbạn sẽ thấy danh sách những người dùng trên máy của mình.

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.