Perbedaan antara "cd -" dan "cd ~ -"

56

Perintah Bash

cd - 

mencetak direktori yang sebelumnya digunakan dan mengubahnya.

Di sisi lain, perintah Bash

cd ~-

langsung berubah ke direktori yang sebelumnya digunakan, tanpa menggema apa pun.

Apakah itu satu-satunya perbedaan? Apa kasus penggunaan untuk masing-masing perintah?

dr01
sumber
3
Saya sarankan Anda tidak menggunakan hal-hal rumit ini. Ini otak Anda cd ~-.
DepressedDaniel
10
@DepressedDaniel, bahkan jika Anda tidak (berencana untuk) menggunakan hal-hal yang rumit, masih berguna untuk memahami apa yang terjadi di balik layar - memahami kasus sudut dapat membuat Anda keluar dari lubang di kemudian hari ketika mencoba men-debug sesuatu yang berbeda.
anotherdave

Jawaban:

81

Ada dua hal yang berperan di sini. Pertama, -sendiri diperluas ke direktori Anda sebelumnya. Ini dijelaskan di cdbagian man bash(penekanan milikku):

Argumen dari -dikonversi ke $ OLDPWD sebelum perubahan direktori dicoba. Jika nama direktori non-kosong dari CDPATH digunakan, atau jika -argumen pertama, dan perubahan direktori berhasil, nama path absolut dari direktori kerja baru ditulis ke output standar. Nilai kembali benar jika direktori berhasil diubah; salah kalau tidak.

Jadi, sederhana cd -akan memindahkan Anda kembali ke direktori sebelumnya dan mencetak nama direktori. Perintah lain didokumentasikan di bagian "Ekspansi Tilde":

Jika awalan tilde adalah ~+, nilai dari variabel shell PWD menggantikan awalan tilde. Jika tilde-prefix adalah a ~-, nilai variabel shell OLDPWD, jika diset, diganti. Jika karakter yang mengikuti tilde dalam awalan tilde terdiri dari angka N, secara opsional diawali oleh a +atau a -, awalan tilde digantikan dengan elemen yang sesuai dari tumpukan direktori, karena akan ditampilkan oleh dirs builtin dipanggil dengan awalan tilde sebagai argumen. Jika karakter mengikuti tilde dalam awalan tilde terdiri dari angka tanpa memimpin +atau -, +diasumsikan.

Ini mungkin lebih mudah dipahami dengan contoh:

$ 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

Jadi, secara umum, -berarti "direktori sebelumnya". Itu sebabnya cd -dengan sendirinya akan memindahkan Anda kembali ke mana pun Anda berada.

Perbedaan utama adalah yang cd -spesifik untuk cdbuiltin. Jika Anda mencobanya echo -hanya akan mencetak a -. Ini ~-adalah bagian dari fungsi ekspansi tilde dan berperilaku mirip dengan variabel. Itu sebabnya Anda bisa echo ~-dan mendapatkan sesuatu yang bermakna. Anda juga bisa menggunakannya cd ~-tetapi Anda bisa menggunakannya di perintah lain. Misalnya cp ~-/* .yang setara dengancp "$OLDPWD"/* .

terdon
sumber
1
set -xuntuk mencetak perintah yang diperluas sebelum menjalankannya mungkin berguna untuk menggambarkan perbedaannya (atau mungkin hanya berisik yang tidak dapat dibaca ketika Anda tidak melakukannya sendiri satu langkah pada satu waktu).
Peter Cordes
1
@terdon hari ini saya pelajari.
sitilge
Singkatnya ... cd ~-/..bekerja, cd -/..tidak!
Ray Foss
13

~-tunduk pada ekspansi tilde (lihat man bash), jadi yang cddilihat adalah nama direktori sebelumnya secara langsung. -tidak diperluas oleh shell, cdmelihatnya secara langsung, dan berperilaku seperti yang didokumentasikan:

Argumen - setara dengan $ OLDPWD. Jika nama direktori non-kosong dari CDPATH digunakan, atau jika - adalah argumen pertama, dan perubahan direktori berhasil, nama path absolut dari direktori kerja baru ditulis ke output standar.

choroba
sumber
4

TL; DR: cd -sudah ada di dalam cd, ~-merupakan ekstensi nanti ~[name], tidak khusus untuk cd.

POSIX.1-2008 Shell & Utilities mendefinisikan cd -sebagai kasus khusus yang spesifik untuk cdperintah :

Ketika a -digunakan sebagai operan, ini harus setara dengan perintah:

cd "$OLDPWD" && pwd

yang berubah ke direktori kerja sebelumnya dan kemudian menulis namanya.

The ~-ekstensi akan diperluas ke $OLDPWDsebelum perintah apapun dijalankan dan dapat dilewatkan sebagai argumen untuk perintah apapun, bukan hanya cd. Ini adalah ekstensi nanti dalam dan .

Standar Shell & Utilities POSIX.1-2008 tersebut di atas juga memiliki penjelasan terperinci tentang Ekspansi Tilde . Kata-katanya sangat spesifik untuk memungkinkan ~-perilaku yang tidak terdefinisi dalam lingkup standar, di mana ~[name]mengacu pada $HOMEapakah [name]string kosong, atau direktori home pengguna namejika nameadalah nama pengguna yang valid.

Henk Langeveld
sumber