Là `~ / Documents` là một đường dẫn tương đối hay tuyệt đối?


37

Đây chỉ đơn thuần là một câu hỏi từ vựng, nhưng nó cứ quay cuồng trong đầu tôi.

Nó xuất phát từ một bài kiểm tra thực hành từ một cuốn sách luyện thi LPIC . Câu trả lời đúng theo cuốn sách ~/Documentslà một thư mục tương đối vì nó liên quan đến thư mục chính.

Tuy nhiên, cuốn sách này chứa một tỷ lệ lỗi chính tả và lỗi sai vì vậy tôi không thể chấp nhận tất cả những gì được viết ở đó. Ở đây tôi không đồng ý vì đối với tôi ~hoạt động như một biến được mở rộng bởi shell thành nội dung của $HOMEbiến hoặc đường dẫn thư mục nhà người dùng hiện tại (cf man bash), vì vậy đường dẫn /home/myuser/Documentsthực sự là một thư mục tuyệt đối.

Ngay cả Wikipedia , lần đầu tiên, dường như không giúp ích gì cho tôi về chủ đề này (ngay cả khi nó dường như xác nhận rằng cuốn sách sai về điều này):

Một đường dẫn tuyệt đối hoặc đầy đủ trỏ đến cùng một vị trí trong một hệ thống tệp bất kể thư mục làm việc hiện tại. Để làm điều đó, nó phải chứa thư mục gốc.

Ngược lại, một đường dẫn tương đối bắt đầu từ một số thư mục làm việc nhất định, tránh việc phải cung cấp đường dẫn tuyệt đối đầy đủ.

Ở đây một lần nữa, tôi không đồng ý: theo định nghĩa này, đường dẫn /opt/kde3/bin/../libkhông phụ thuộc vào thư mục làm việc hiện tại phải là một đường dẫn tuyệt đối, tuy nhiên cách hiểu hiện tại của tôi về điều này phù hợp với tác giả của cuốn sách làm cho đường dẫn này trở thành tương đối.

Một tìm kiếm trên web nhanh chóng chỉ làm tôi thêm thất vọng, theo Webster Dictionary :

đường dẫn tuyệt đối - Một đường dẫn liên quan đến thư mục gốc. Ký tự đầu tiên của nó phải là dấu phân cách tên đường dẫn.

Vì vậy $HOME/Documents, hoặc thậm chí $HOMEsẽ không được coi là thư mục tuyệt đối? Hay định nghĩa này ngụ ý mở rộng biến? Còn ~nhân vật của cái vỏ thì sao? Có bất kỳ định nghĩa đáng tin cậy về thư mục tương đối so với tuyệt đối tôi có thể tìm thấy ở đâu đó và tôi có sai không?


7
Tất cả các đường dẫn đều tương đối, một số trong chúng chỉ tương đối với thư mục gốc /và những đường dẫn chúng ta gọi là tuyệt đối. Như vậy tất cả mọi thứ gì bắt đầu từ /tôi sẽ gọi tuyệt đối (thậm chí nếu điều này là /usr/../etc) và mọi thứ khác tôi sẽ gọi tương đối ( ~/Doc, Doc, ../john/Doc, $HOME/..., ...). Vấn đề là tuyệt đối nên hoạt động bất kể thư mục làm việc hiện tại hoặc người dùng hiện tại. Tương đối chỉ có thể làm việc trong một số trường hợp hẹp cụ thể.
jimmij 8/8/2015

6
Đường dẫn có thể mở rộng đến một vị trí khác nhau tùy thuộc vào người dùng là ai. Có nói rằng, đây vẫn là một con đường tuyệt đối, không phải là một con đường tương đối, theo ý kiến ​​của tôi. Mặc dù tôi không nghĩ các định nghĩa về đường dẫn tuyệt đối và tương đối được xác định chính xác như vậy. Đây không phải là toán học. Câu hỏi này không thực sự kiểm tra sự hiểu biết, imo và là vô nghĩa.
Faheem Mitha

1
@FaheemMitha: LPIC là chứng nhận Linux trung tính phân phối. Bản thân chứng chỉ có vẻ ổn, nhưng đây không phải là trường hợp về (ít nhất là một số) sách được bán để chuẩn bị cho kỳ thi này là tự học ...
WhiteWinterWolf

2
@jimmij: "họ hàng" có ý nghĩa kỹ thuật cụ thể trong ngữ cảnh của các đường dẫn và sử dụng ý nghĩa tiếng Anh khác của từ này là thông lệ xấu. Tôi hoàn toàn không đồng ý với việc gọi ~/foomột con đường tương đối. Những gì bạn đang nhận được là sự khác biệt giữa mã hóa cứng và tham số hóa. Xem câu trả lời của tôi để biết thêm chi tiết.
Peter Cordes

1
Các định nghĩa của Từ điển Webster là chính xác, nhưng rất khó hiểu. Tuy nhiên, nó ngụ ý rằng các chuỗi như ~/Documents$HOME/Documentskhông phải là đường dẫn. Chúng xác định đường dẫn (tuyệt đối) sau khi mở rộng, nhưng bản thân chúng không phải là đường dẫn. Tôi nghĩ điều đó đồng ý với việc có bao nhiêu người dùng Unix / Linux sử dụng thuật ngữ này, nhưng chắc chắn các chuỗi đó cũng được gọi là các đường dẫn.
Revierpost

Câu trả lời:


41

Nếu tác giả đang cố gắng đuổi bạn ra bằng cách nói về chuỗi ký tự đó (không mở rộng shell) như một đường dẫn, thì đó là một đường dẫn tương đối ( mkdir -p './~/Documents'). Nếu không thì:


Đó là một đường dẫn tuyệt đối , bởi vì việc giải quyết nó không phụ thuộc vào thư mục làm việc hiện tại của quy trình. Đường dẫn tương đối luôn có nghĩa là liên quan đến thư mục làm việc của quá trình. Hoặc trong trường hợp các mục tiêu liên kết tượng trưng, ​​liên quan đến vị trí của liên kết tượng trưng. ( gcc -> gcc-5.2so với gcc -> /usr/bin/gcc-5.2). Điều này quan trọng đối với ngàm NFS và các trường hợp khác mà bạn có thể truy cập cùng một liên kết thông qua các đường dẫn tuyệt đối khác nhau. ví dụ

/net/tesla/home/peter/foo -> bar  # always works from other machines

/net/tesla/home/peter/foo -> /home/peter/bar  # references my home dir on the local machine, not tesla.

Debian đôi khi sẽ cài đặt các liên kết tượng trưng ../../doc/whatever/whatever, thay vì một mục tiêu liên kết tượng trưng tuyệt đối, do đó, nó hoạt động khi NFS được gắn ở một nơi khác hoặc khi nhìn vào một chroot mà không cần chroot(8)vào nó.

Mỗi tiến trình Unix đều có cwd riêng. Các pwdlệnh tồn tại chỉ để in nó.

xem: http://pub.opengroup.org/onlinepub/9699919799/fifts/getcwd.html để biết thêm về cách thay đổi thư mục với các cuộc gọi hệ thống POSIX.


Như mọi người khác đã nói, ~được mở rộng bởi shell trước khi đường dẫn được sử dụng cho bất cứ điều gì. Sử dụng ~/bin/myprogtrong một kịch bản shell sẽ làm cho nó hoạt động khác nhau cho những người dùng khác nhau. Sự khác biệt giữa ~/bin/foo/home/peter/bin/foolà một trong số họ đã mã hóa vị trí, trong khi cái còn lại đã tham số hóa nó. Đó là một lỗi (IMO) để gọi ~phiên bản là một đường dẫn tương đối.

Nói về những thứ "liên quan đến một biến môi trường" chỉ là khó hiểu. Việc sử dụng các ý nghĩa tiếng Anh khác nhau của các thuật ngữ có ý nghĩa kỹ thuật cụ thể trong bối cảnh bạn đang sử dụng chúng là một cách sử dụng.

Trên một hệ thống bị hỏng, với HOME=a/relative/path, ~/foosẽ mở rộng thành một đường dẫn tương đối. Đây hoàn toàn không phải là một thiết lập có thể sử dụng được.


3
Cảm ơn bạn cho câu trả lời này, nó dường như là một trong những toàn diện nhất với tôi. Tôi cũng có ấn tượng rằng tác giả đã nhầm lẫn giữa khái niệm đường dẫn chính tắc vào điều này (mà tác giả không đề cập đến ở bất cứ đâu). /opt/kde3/bin/../libví dụ, được phân loại sai thành một đường dẫn tương đối: đó một đường dẫn tuyệt đối nhưng không phải là đường dẫn chính tắc. Như bạn đã nói, điều này chỉ khiến mọi thứ trở nên khó hiểu, vì vậy cảm ơn bạn đã làm rõ và thông tin liên quan đến NFS :)!
WhiteWinterWolf

1
Tôi phải kết luận rằng viết một cuốn sách luyện thi không có gì thú vị và những người chỉ sử dụng Unix hoặc GNU / Linux cho máy tính hàng ngày của họ không phải là những người viết những cuốn sách đó. Đó là ví dụ về một cách gọi một con đường phi canononical tương đối dường như thực sự tồi tệ và rõ ràng đối với tôi. man7.org/linux/man-pages/man3/realpath.3.html (và realpath(1)) làm cả hai việc: chuẩn hóa và làm cho tuyệt đối (cũng như theo các liên kết tượng trưng), vì vậy có thể có một số nhầm lẫn xuất hiện ở đó.
Peter Cordes

2
Tuy nhiên, đó chỉ là những khái niệm thông thường hàng ngày đối với tôi. Tôi nghĩ thật kỳ lạ khi có một mảnh giấy nói rằng tôi biết họ ... Nhưng chúc may mắn nhận được mảnh giấy của bạn, @WhiteWinterWolf, để hiển thị cho tất cả những người thích nhìn vào những mảnh giấy. :)
Peter Cordes

48

Đây thực chất là một câu hỏi về định nghĩa của các điều khoản. Vì vậy, cho mục đích của bạn, câu trả lời là bất cứ điều gì LPIC muốn. Nhưng chúng ta có thể đi đến một số kết luận dựa trên các sự kiện kỹ thuật:

Nếu bạn chuyển '~/Documents'đến một cuộc gọi hệ thống , nó sẽ tìm một thư mục có tên chính xác ~trong thư mục hiện tại (và có thể thất bại). Vì vậy, theo khái niệm tên đường dẫn được sử dụng bởi kernel , đây là đường dẫn tương đối - nhưng đó không phải là ý nghĩa của chúng tôi.

~là cú pháp được thực hiện bởi shell (và các chương trình khác bắt chước nó để thuận tiện) mở rộng nó thành một tên đường dẫn thực sự. Để minh họa, ~/Documentsgần giống như $HOME/Documents(một lần nữa, cú pháp shell). Vì $HOMEphải là một đường dẫn tuyệt đối, giá trị của $HOME/Documents cũng là một đường dẫn tuyệt đối. Nhưng văn bản $HOME/Documentshoặc ~/Documentsphải được mở rộng bởi trình bao để trở thành đường dẫn chúng ta muốn nói.

Do đó, nếu tôi muốn chính xác và nhất quán, tôi sẽ nói rằng đó ~/Documentsmột đoạn của shell-script mở rộng đến một đường dẫn tuyệt đối.


Tất nhiên, kernel sẽ không biết ý $HOMEnghĩa của nó là gì , giống như nó không có ý ~nghĩa gì . Tuy nhiên tôi thấy tuyên bố rằng ~ việc mở rộng được thực hiện bởi shell là không rõ ràng; hầu hết các ứng dụng hỗ trợ điều này, hướng đến thư viện C thay vì shell. Tuy nhiên, mở rộng biến môi trường một tính năng của vỏ; bạn có thể mở ~/somefile.odttrong LibreOffice, nhưng không $HOME/somefile.odt, ngay cả khi LibreOffice được khởi động từ một trình bao trong đó $ HOME được đặt đúng.
một CVn

5
Bạn có thể thấy nó đáng ngờ tất cả những gì bạn muốn, nhưng nó được ghi lại và dễ dàng xác nhận hoặc từ chối trong C.
Vô dụng

6
Các chương trình khác thực hiện ~cú pháp bắt chước shell, vì đó là một phím tắt hữu ích. Tôi thực sự không biết liệu có một chức năng thư viện nào thực hiện việc mở rộng hay không, nhưng chắc chắn đó là thứ được thực hiện tách biệt với việc sử dụng tên đường dẫn.
Kevin Reid

2
globwordexpmở rộng dấu ngã trong số những thứ khác.
o11c

2
@ MichaelKjorling: Một vài chương trình thực hiện ~mở rộng; hầu hết không. Ví dụ, nếu bạn gõ ls -l ~, lschương trình không bao giờ nhìn thấy ~ký tự; nó được mở rộng bởi lớp vỏ trước khi lsđược gọi. Nếu bạn thực sự vượt qua một ~đến ls, nó sẽ không đối xử với nó đặc biệt; thử ls -l '~'`(sẽ cố gắng liệt kê một tệp có tên theo nghĩa đen ~).
Keith Thompson

16

Nếu bạn $HOME/home/white/, ~/Documents(giống như $HOME/Documents) được mở rộng bởi shell (xem ở đây để giải thích) /home/white/Documents, đó là một đường dẫn tuyệt đối .

Đường dẫn tương đối là đường dẫn không bắt đầu bằng /(sau khi mở rộng shell), như ../Documentshoặcfoo/bar

Một số vỏ cũ không mở rộng ~(đường bash, tcsh, zsh, vv ... làm); họ sẽ thấy ~/Documentsnhư một con đường tương đối bắt đầu bằng ~; nhưng bạn thường không có tên thư mục như ~(nhưng bạn có thể tạo một tên mkdir '~'mà tôi không khuyên dùng).


bạn nên đề cập đến lớp vỏ nào không mở rộng~
Edward Torvalds

3

Một đường dẫn tuyệt đối bắt đầu tại /(những gì nó đề cập đến là cố định), một đường dẫn tương đối bắt đầu tại thư mục hiện tại (và do đó, những gì nó đề cập đến thay đổi khi thư mục hiện tại thay đổi). Hầu hết các shell sử dụng ~lúc đầu là viết tắt cho đường dẫn tuyệt đối đến thư mục chính của người dùng hiện tại, tức ~/Documentslà thư mục Documentstrong nhà của người dùng hiện tại, bất kể thư mục hiện tại có thể là gì. Vì vậy, nó là một con đường tuyệt đối.


1

Đường dẫn có thể mở rộng đến một vị trí khác nhau tùy thuộc vào người dùng là ai. Có nói rằng, đây vẫn là một con đường tuyệt đối, không phải là một con đường tương đối, theo ý kiến ​​của tôi. Tuy nhiên, tôi không nghĩ các định nghĩa về đường dẫn tuyệt đối và tương đối được xác định chính xác như vậy. Đây không phải là toán học. Câu hỏi này không thực sự kiểm tra sự hiểu biết, theo ý kiến ​​của tôi, và là vô nghĩa.


Định nghĩa là nhiều hơn nhiều so với ý kiến. Wikipedia đánh mạnh vào trường hợp chung, không chỉ Unix: en.wikipedia.org/wiki/iêu
Peter Cordes

1

Việc sử dụng ~ / ở đầu làm cho đường dẫn tuyệt đối vì (theo bất kỳ định nghĩa nào) có thể tìm thấy tài liệu không phụ thuộc vào vị trí hiện tại của bạn. Tuy nhiên, việc mở rộng được thực hiện bởi shell chứ không phải kernel, vì vậy nếu bạn đang sử dụng shell không nhận ra cú pháp này (chẳng hạn như / bin / sh, shell Bourne ban đầu, không phải bí danh bash), bạn sẽ thoát khỏi may mắn

Thật thú vị, nếu bạn sử dụng ~ root / chứ không phải ~ /, việc tối ưu hóa việc đọc $ HOME thường không áp dụng và nó sẽ luôn giải quyết tuyệt đối nếu / etc / passwd là chính xác.


-1

Cuốn sách dường như đang đưa ra quan điểm rằng một con đường tuyệt đối là bất kỳ con đường nào bắt đầu bằng một /, và một con đường tương đối là bất cứ điều gì khác.

Bạn có thể xem ..$HOMEcác loại mã thông báo tương tự. Cả hai cần phải được thay thế, cho một thành phần đường dẫn, trước khi đường dẫn chuyển thành một đường dẫn tuyệt đối.


3
Thế nào là ..như thế $HOMEnào? ..có thể ở đầu một đường dẫn được truyền trực tiếp đến một cuộc gọi hệ thống, không cần mở rộng hệ vỏ. Một con đường như vậy không phải là một con đường tuyệt đối; nó vẫn liên quan đến vị trí cwd hoặc symlink. Trừ khi tác giả đang cố gắng đuổi bạn ra bằng cách nói về chuỗi ký tự đó (không mở rộng vỏ) như một đường dẫn. Tôi nghĩ rằng bạn đang cố gắng đưa ra lời bào chữa cho cuốn sách, nhưng tôi có xu hướng chỉ nói rằng nó sai và không để mọi thứ bị rối loạn.
Peter Cordes
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.