Làm thế nào để biết nếu tôi thực sự ở một vị trí liên kết tượng trưng từ dòng lệnh?


33

Giả sử tôi có một thư mục:

cd /home/cpm135/public_html

và tạo một liên kết tượng trưng

ln -s /var/lib/class .

Sau đó, tôi đang ở trong thư mục đó:

cd /home/cpm135/public_html/class

Tôi pwdsẽ nói với tôi/home/cpm135/public_html/class

Có cách nào để biết rằng tôi "thực sự" /var/lib/classkhông? Cảm ơn



1
Một số shell không thực sự cho phép bạn ở trong một liên kết tượng trưng. Ví dụ, trình fishbao tự động giải quyết liên kết tượng trưng khi bạn cdvào nó.
phân ly

Câu trả lời:


56

Tùy thuộc vào cách pwdlệnh của bạn được cấu hình, nó có thể mặc định hiển thị thư mục làm việc logic (đầu ra theo pwd -L) sẽ hiển thị vị trí liên kết tượng trưng hoặc thư mục làm việc vật lý (đầu ra bởi pwd -P) mà bỏ qua liên kết tượng trưng và hiển thị thư mục "thực".

Để biết thông tin đầy đủ bạn có thể làm

file "$(pwd -L)"

Trong một liên kết tượng trưng, ​​điều này sẽ trở lại

/path/of/symlink: symbolic link to /path/of/real/directory

1
vâng, -Pcờ là thứ tôi cần Cảm ơn
Oliver Williams

6
Để trả lời câu hỏi trong tiêu đề, chỉ cần sử dụng test "$(pwd -L)" = "$(pwd -P)" && echo No symlinks(hoặc thay thế && echo No symlinksbằng || echo Symlinks).
một CVn

1
Điều này trả lời câu hỏi hoàn hảo mà không cần phải lặp lại. Nếu câu hỏi là 'Làm cách nào để hiển thị một tin nhắn nếu tôi đang ở trong một thư mục được liên kết? "Thì tiếng vang sẽ được yêu cầu
Arronical

file "$(pwd)"chỉ hoạt động nếu symlink là thành phần thư mục cuối cùng. Nó không phát hiện ra liên kết tượng trưng của OP khi được ghi vào /home/cpm135/public_html/class/foo/bar. Tôi không biết bất cứ điều gì in thông tin cho tất cả các liên kết trong một tên đường dẫn, nhưng bạn cũng có thể sử dụng realpath ., mà tôi nghĩ là tương đương vớipwd -P
Peter Cordes

17

Lưu ý rằng đó pwdthực sự là một vỏ tích hợp. Tùy thuộc vào vỏ của bạn và cấu hình của nó, kết quả có thể thay đổi. Đối với một giải pháp di động hơn, bạn nên sử dụng /bin/pwd. Đoạn trích từ trang hướng dẫn:

NAME
       pwd - print name of current/working directory

SYNOPSIS
       pwd [OPTION]...

DESCRIPTION
       Print the full filename of the current working directory.

       -L, --logical
              use PWD from environment, even if it contains symlinks

       -P, --physical
              avoid all symlinks

       --help display this help and exit

       --version
              output version information and exit

       If no option is specified, -P is assumed.

       NOTE:  your  shell  may  have  its  own  version of pwd, which usually supersedes the version described here.  Please refer to your shell's documentation for
       details about the options it supports.

Nói chung, bạn có thể giải quyết đường dẫn chính tắc đầy đủ của bất kỳ tệp / thư mục nào bằng cách sử dụng readlink -f. readlink -f .hoạt động tương tự pwd -P.


2
Mặc dù tôi đã học được cách khó mà readlink -fkhông có trên tất cả các Thông báo (ví dụ: không khả dụng trên OS-X)
rút ngắn

3

Bạn thực sự đang ở /home/cpm135/public_html/class- đó là câu trả lời đúng duy nhất cho câu hỏi "thư mục làm việc hiện tại của tôi là gì".

Khi bạn đề cập đến /var/lib/class... đó không thực sự là về nơi bạn ở, mà nhiều hơn về con đường bạn đã sử dụng để đến đó .

Khi bạn chạy /bin/pwd, nó chỉ ra thư mục làm việc hiện tại của bạn bằng cách nhìn vào. và .. thư mục (những thư mục được liệt kê ở trên cùng ls -la), tìm ra thư mục nào trong .. khớp với. và sau đó làm việc ngược cho đến khi .. và. tham khảo cùng thư mục. Khi nó đã hoàn thành tất cả, nó sẽ biết thư mục làm việc hiện tại của bạn là gì.

Khi bạn chạy pwdshell được tích hợp sẵn, nó không tuân theo quy trình này (mặc dù nó có thể thực hiện một số thao tác nếu cần) - thay vào đó, nó nhớ đường dẫn mà bạn đã đi đến đây. Vì vậy, mỗi khi bạn thực hiện một cdlệnh, shell của bạn sẽ nhớ rằng đó là một phần của đường dẫn để đến nơi bạn đang ở hiện tại và pwdin ra những gì nó đã tính toán dựa trên tất cả các cdlệnh bạn đã thực hiện - có thể hoặc không phải là thực tế của bạn thư mục làm việc.

Mọi thứ có thể trở nên thực sự kỳ lạ khi bạn thực hiện ln -s . foovà tiếp tục tìm cdhiểu - /bin/pwdsẽ nói rằng bạn vẫn ở trong cùng một thư mục, nhưng trình dựng sẵn shell pwdsẽ nói bạn đang ở trong /foo/foo/foo/foo/foo/foo- mặc dù không có thư mục nào như vậy thực sự tồn tại. (Điều đó nói rằng - bạn có thể có thể cd vào nó.)

Một nguồn gây nhầm lẫn khác là nếu các thư mục được đổi tên. /bin/pwdsau đó sẽ nhận thay đổi ngay lập tức, nhưng tích hợp pwdsẽ không cho đến khi bạn làm điều gì đó cho biết tên thư mục cũ không thành vấn đề.


1
Bạn không trả lời câu hỏi, bạn đang từ chối nó.
Dmitry Grigoryev

4
Mặc dù điều này không trả lời trực tiếp câu hỏi , tôi nghĩ đó là một bài viết hữu ích để hiểu sự khác biệt giữa pwdnội dung của trình bao /bin/pwdvà giải thích cách phiên bản độc lập cung cấp nhiều thông tin hữu ích hơn (có thể trả lời câu hỏi ban đầu).
Anthony G - công lý cho Monica

1
Những khác biệt này tất cả sôi sục đến -P-Lcác tùy chọn được đề cập bởi các câu trả lời khác. Nói tóm lại, một số triển khai mặc định cho một, một số khác. Trên hệ thống Centos tôi phải xử lý, nội dung của bash được mặc định là logic và /bin/pwdmặc định là vật lý, nhưng cả hai đều chấp nhận cả hai tùy chọn dòng lệnh và đồng ý với kết quả khi chúng được đưa ra.
IMSoP

1
Câu hỏi dựa trên một tiền đề không chính xác - 'có cách nào để biết rằng tôi "thực sự" trong / var / lib / class không?' Điều đó nói rằng ... bằng cách giải thích điều đó thực sự có nghĩa là gì, nó giúp anh ta hiểu những gì anh ta thực sự tìm kiếm. Các tùy chọn pwd -P và -L đã được đề cập ...
dougmc

1
Bạn có lập luận của bạn ngược lại. ls ..sẽ hiển thị nội dung của /var/lib, không /home/cpm135/public_html. cd ..là đặc biệt: shell thực hiện theo dõi đặc biệt về "cách bạn đến đó" và không thực sự thực hiện một chdir("..")cuộc gọi hệ thống. Theo như kernel có liên quan, thư mục làm việc hiện tại của shell của bạn ( /proc/self/cwd) chỉ là một cặp mountpoint: inode. Nó giống như một mô tả tập tin mở trên thư mục, đó là lý do tại sao việc đổi tên thư mục không phá vỡ vỏ của bạn. ( cd .để cập nhật $PWDbiến của shell ). Bạn đang tạo ra một điểm hữu ích, vì vậy tôi sẽ nâng cao điều này khi cố định
Peter Cordes

1

Về cơ bản, bạn đang hỏi nếu có để hiển thị đường dẫn thực tế của thư mục làm việc hiện tại. Vâng, có với python và os.getcwd()chức năng

Những gì bạn thấy dưới đây là một thử nghiệm nhỏ trong thư mục "VirtualBox VMs" nằm trong thư mục nhà của tôi. Trong thực tế, đó là một liên kết tượng trưng đến một thư mục khác nằm trên ổ cứng khác, được gắn tại /mnt/HDD.

bash-4.3$ file "$(pwd)"
/home/xieerqi/VirtualBox VMs: symbolic link to /mnt/HDD/VirtualBox VMs/
bash-4.3$ python -c 'import os; print os.getcwd()'
/mnt/HDD/VirtualBox VMs

Như bạn có thể thấy, python's os.getcwd()giải quyết đường dẫn thực của thư mục, không phải đường dẫn của symlink.

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.