Sự khác biệt giữa cd cd


56

Lệnh Bash

cd - 

in thư mục được sử dụng trước đó và thay đổi nó.

Mặt khác, lệnh Bash

cd ~-

trực tiếp thay đổi thư mục được sử dụng trước đó, mà không lặp lại bất cứ điều gì.

Đó có phải là sự khác biệt duy nhất? Trường hợp sử dụng cho mỗi lệnh là gì?


3
Tôi khuyên bạn không nên sử dụng bất kỳ thứ gì khó khăn này. Đây là bộ não của bạn trên cd ~-.
DepressionDaniel

10
@DepressionDaniel, ngay cả khi bạn không (dự định) sử dụng những thứ khó khăn, vẫn rất hữu ích để hiểu những gì đang diễn ra sau hậu trường - hiểu các trường hợp góc có thể giúp bạn thoát khỏi lỗ hổng sau này khi cố gắng gỡ lỗi một cái gì đó khác.
otherdave

Câu trả lời:


81

Có hai điều đang chơi ở đây. Đầu tiên, -một mình được mở rộng đến thư mục trước đó của bạn. Điều này được giải thích trong cdphần man bash(nhấn mạnh của tôi):

Một đối số -được chuyển đổi thành $ OLDPWD trước khi thử thay đổi thư mục. Nếu tên thư mục không trống từ CDPATH được sử dụng hoặc nếu -là đối số đầu tiên và thay đổi thư mục thành công, tên đường dẫn tuyệt đối của thư mục làm việc mới được ghi vào đầu ra tiêu chuẩn. Giá trị trả về là true nếu thư mục được thay đổi thành công; sai khác.

Vì vậy, một đơn giản cd -sẽ đưa bạn trở lại thư mục trước đó và in tên của thư mục ra. Lệnh khác được ghi lại trong phần "Mở rộng Tilde":

Nếu tiền tố dấu ngã là a ~+, giá trị của biến shell PWD thay thế tiền tố dấu ngã. Nếu tiền tố dấu ngã là a ~-, giá trị của biến shell OLDPWD, nếu được đặt, được thay thế. Nếu các ký tự theo dấu ngã trong tiền tố dấu ngã bao gồm một số N, thì tiền tố tùy ý được tạo bởi a +hoặc a -, tiền tố dấu ngã được thay thế bằng phần tử tương ứng từ ngăn xếp thư mục, vì nó sẽ được hiển thị bởi các thư mục được xây dựng bằng tiền tố dấu ngã làm đối số. Nếu các ký tự theo dấu ngã trong tiền tố dấu ngã bao gồm một số không có đầu +hoặc -, +được giả sử.

Điều này có thể dễ hiểu hơn với một ví dụ:

$ pwd
/home/terdon
$ cd ~/foo
$ pwd
/home/terdon/foo
$ cd /etc
$ pwd
/etc
$ echo ~        ## prints $HOME
/home/terdon
$ echo ~+       ## prints $PWD
/etc
$ echo ~-       ## prints $OLDPWD
/home/terdon/foo

Vì vậy, nói chung, -có nghĩa là "thư mục trước". Đó là lý do tại sao cd -chính nó sẽ đưa bạn trở lại bất cứ nơi nào bạn đang có.

Sự khác biệt chính cd -là cụ thể cho cdnội dung. Nếu bạn cố gắng echo -nó sẽ chỉ in một -. Đây ~-là một phần của chức năng mở rộng dấu ngã và hoạt động tương tự như một biến. Đó là lý do tại sao bạn có thể echo ~-và có được một cái gì đó có ý nghĩa. Bạn cũng có thể sử dụng nó trong cd ~-nhưng bạn cũng có thể sử dụng nó trong bất kỳ lệnh nào khác. Ví dụ cp ~-/* ., tương đương vớicp "$OLDPWD"/* .


1
set -xđể in lệnh mở rộng trước khi thực hiện, có thể hữu ích để minh họa sự khác biệt (hoặc có thể gây ồn ào không thể đọc được khi bạn không tự mình thực hiện từng bước một).
Peter Cordes

1
@terdon hôm nay tôi học được.
sitilge

Trong ngắn hạn ... cd ~-/..hoạt động, cd -/..không!
Ray Foss

13

~-có thể mở rộng dấu ngã (xem man bash), vì vậy những gì cdnhìn thấy là tên thư mục trước đó trực tiếp. -không được mở rộng bởi shell, cdnhìn thấy nó trực tiếp và hoạt động như tài liệu:

Một đối số của - tương đương với $ OLDPWD. Nếu tên thư mục không trống từ CDPATH được sử dụng hoặc nếu - là đối số đầu tiên và thay đổi thư mục thành công, tên đường dẫn tuyệt đối của thư mục làm việc mới được ghi vào đầu ra tiêu chuẩn.


4

TL; DR: cd -được tích hợp vào cd, ~-là phần mở rộng sau này ~[name], không cụ thể cd.

POSIX.1-2008 Shell & Utility định nghĩa cd -là trường hợp đặc biệt dành riêng cho cdlệnh :

Khi a -được sử dụng làm toán hạng, điều này sẽ tương đương với lệnh:

cd "$OLDPWD" && pwd

thay đổi thư mục làm việc trước đó và sau đó viết tên của nó.

Phần ~-mở rộng sẽ được mở rộng đến $OLDPWDtrước khi bất kỳ lệnh nào được thực thi và có thể được chuyển qua làm đối số cho bất kỳ lệnh nào, không chỉ cd. Nó là một phần mở rộng sau này trong .

Tiêu chuẩn Shell & Tiện ích POSIX.1-2008 đã nói ở trên cũng có một lời giải thích chi tiết về Mở rộng Tilde . Từ ngữ rất cụ thể để cho phép ~-hành vi không xác định trong phạm vi của tiêu chuẩn, trong đó ~[name]đề cập đến $HOMEnếu [name]là chuỗi rỗng hoặc thư mục chính của người dùng namenếu namelà tên người dùng hợp lệ.

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.