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 cd
phầ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 cd
nộ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"/* .
cd ~-
.