Perbedaan antara 'cd' dan 'cd ~'

10

Saya bertanya-tanya, jika cd saja mengirim saya ke folder rumah saya dan cd ~ melakukan hal yang sama, mengapa ~ ditambahkan di tempat pertama?

Apakah ini sesuatu yang spesifik untuk BASH atau akankah mereka berperilaku berbeda di Shell lain?

Luis Alvarado
sumber
2
Jelas bukan duplikat. Pertanyaan yang bertanya tentang cd ~vs cd $HOMEvs cd ~not-tandu. Pertanyaan ini bertanya tentang cdvs cd ~.

Jawaban:

17

The ~dapat digunakan untuk lebih dari itu. Perintah apa pun dapat mengambil untung dari memiliki jalan pintas ke folder rumah. Jadi tidak perlu jika Anda ingin cd ke rumah Anda, tetapi bagaimana ~/.config?

$ cd ~/.config

Kalau tidak, Anda harus menulis jalan rumah, menggunakan $HOMEvar, atau melakukan dua cds. Juga untuk menyalin atau memindahkan file:

$ cp ~/downloads/some-file some/path/

Karena sebagian besar file Anda ada di rumah, selalu ada jalan pintas.

ahilsend
sumber
Hai ahilsend, sebenarnya pertanyaan saya lebih ke arah mengapa 2 cara. Saya sudah tahu tentang ~ menggunakan variabel $ HOME tetapi, dengan pikiran ini, mengapa "CD" saja juga mengirim saya ke rumah. Mengapa 2 cara untuk tujuan yang sama?
Luis Alvarado
4
@ CYREX Tebakan saya adalah menyimpan pengetikan untuk kasus yang sangat umum yaitu ingin pindah ke direktori home Anda.
CVn
1
Penggunaan lain ~adalah yang harus dilakukan cd ~user/downloaduntuk pergi ke direktori unduhan pengguna.
ott--
5

Melakukan cd pada dasarnya memanggil cdtanpa argumen dan sesuai dengan cdperilaku "... jika dir tidak diberikan, nilai variabel shell HOME adalah default." (dari manual bash ). Sebaliknya, cd ~adalah ketika Anda memberikan argumen ke cdperintah, yang kebetulan ~dan shell akan melakukan ekspansi tilde . Sejauh kembali ke direktori home pengguna - tidak ada perbedaan. Dalam kedua kasus, HOMEvariabel lingkungan akan ditanyakan:

$ env 'HOME=/usr' bash -c 'cd;pwd; cd ~;pwd'                                      
/usr
/usr

Secara efektif, ini juga tidak memiliki perbedaan cd $HOME. Namun, sementara cdakan melakukan satu-satunya hal, tilde dapat digunakan untuk melakukan ekspansi lain seperti ~+untuk direktori kerja saat ini.

Namun, cukup menarik kita bisa unset HOMEuntuk istirahat cdtetapi ~masih akan bekerja:

$ bash -c 'cd /usr;unset HOME;cd;pwd;cd ~;pwd'                                    
bash: line 0: cd: HOME not set
/usr
/home/xieerqi

Mengapa Sekali lagi, jawablah di manual:

Jika HOME tidak disetel, direktori home dari pengguna yang menjalankan shell diganti. Jika tidak, awalan tilde diganti dengan direktori home yang dikaitkan dengan nama login yang ditentukan.

Perhatikan bahwa unsetting berbeda dengan membuat variabel kosong HOME=dan memang memiliki efek. Dokumentasi secara khusus berbicara tentang variabel unsetting. Membuat variabel sama dengan string kosong memiliki efek yang berlawanan dengan apa yang kita harapkan:

bash-4.3$ env 'HOME=' bash -c 'cd /usr;set|grep "^HOME"; stat -c "%F" ~;cd;pwd'
HOME=
stat: cannot stat '': No such file or directory
/usr

Di sini Anda dapat melihat bahwa membuat HOMEstring kosong memecah tilde dan cdperilaku.


Tilde dan $HOMEmemiliki sedikit perbedaan dan alasan berbeda untuk keberadaan. $HOMEadalah variabel shell, yang kebetulan juga merupakan salah satu variabel lingkungan - dan tersedia untuk semua program; di C Anda akan menggunakannya environ()untuk mengaksesnya. Sebaliknya, tildeadalah sintaks khusus shell yang melakukan ekspansi tilde, meskipun Anda dapat menggunakan wordexp()fungsi untuk melakukan ekspansi mirip shell ( referensi ) di C juga.

Alasan mengapa ~represent HOMEtelah dijawab dalam pertanyaan ini : pada suatu waktu karakter tilde berbagi kunci yang sama dengan HOMEpada terminal Lear-Siegler ADM-3A. HOMEsebaliknya adalah variabel lingkungan yang memiliki makna simbolis murni dan tidak ada representasi fisik.

Selain itu, fakta bahwa itu HOMEadalah variabel lingkungan memungkinkan kita untuk membatalkannya, di mana kita tidak dapat mengatur ~ke sesuatu yang lain melalui cara sederhana.

# cd ~ will still work, because ~ is blank, so it's same as just cd
$ bash -c 'unset HOME; echo $HOME; cd ~;pwd'                           

/home/xieerqi
$ env 'HOME=' bash -c 'echo $HOME; cd ~;pwd'                                

/home/xieerqi

Perhatikan baris kosong di mana pertama echomenampilkan variabel yang tidak disetel, dan fakta itu. Sebaliknya, kita tidak dapat melakukan hal-hal seperti ini sampai tilde:

$ bash -c '~=; cd ~;pwd'                                                    
bash: ~=: command not found
/home/xieerqi
$ bash -c '~=$'\0'; cd ~;pwd'                                               
bash: ~=bash: command not found
/home/xieerqi
$ bash -c 'unset ~; cd ~;pwd'                                               
bash: line 0: unset: `/home/xieerqi': not a valid identifier
/home/xieerqi

Namun, mengubah HOMEtidak memengaruhi ~:

$ env 'HOME=' bash -c 'echo $HOME; stat ~;'                                 

stat: cannot stat '': No such file or directory

Selain itu, karena ~juga berfungsi sebagai karakter ekspansi, kita dapat melakukan hal-hal seperti ini untuk menampilkan direktori kerja saat ini:

$ bash -c 'cd /etc/;stat -c "%n" ~+'                                        
/etc

Sedangkan jika kita ingin melakukan itu melalui variabel lingkungan, kita perlu PWD, dan HOMEtetap sama, atau jika Anda melakukan hal-hal seperti echo $HOME+- itu hanya rangkaian string / variabel. Tetapi sekali lagi, ~+keluarkan informasi dari variabel lingkungan:

$ bash -c 'cd /etc/;PWD="/usr";stat -c "%n" ~+'                             
/usr

CATATAN : ekspansi ~+dan ~-bekerja ksh, tetapi tidak dalam dash.


Untuk menjawab beberapa pertanyaan spesifik Anda:

Apakah ini sesuatu yang spesifik untuk BASH atau akankah mereka berperilaku berbeda di Shell lain?

Tidak, ini harus merupakan perilaku yang konsisten. ksh,, dashdan csh- semua berperilaku sama dengan cdatau cd ~.

mengapa ~ ditambahkan di tempat pertama itu?

Saya akan mengatakan alasan kenyamanan dan historis seperti yang dijelaskan dalam jawaban terkait tentang tilde. Akhirnya, itu tumbuh untuk melakukan lebih dari ekspansi direktori rumah saja.

Sergiy Kolodyazhnyy
sumber
0

Terlepas dari apakah Anda beberapa level folder di atas atau di bawah $HOME, perintah cddan cd ~melakukan hal yang sama dan tidak berbeda - itu akan mengirim Anda kembali ke direktori HOME Anda.

NAMUN: Ketika Anda 1 atau lebih tingkat folder di atas HOME dan Anda ingin pergi LANGSUNG ke sub-direktori 1 atau lebih tingkat folder di bawah ini $HOME, tilde ( ~) berguna dengan menyimpan penekanan tombol Anda ketika digunakan untuk mengganti teks yang diperlukan untuk merujuk teks untuk $HOMEsaat mengetik cdperintah. Contohnya;

/$ cd    # (or cd ~)
~$ pwd
/home/foo
~$ dir
bar bar2 bar3
~$ cd ..
/$ cd ..
/$ pwd
/
/$ cd /bar3
bash: cd: /bar3: no such file or directory
/$ cd ~/bar3    # (instead of "cd /home/foo/bar3")
~/bar3$ pwd
/home/foo/bar3
P. Alexander
sumber
0

~ kependekan dari / home / nama pengguna lokasi, sehingga Anda menghemat waktu saat mengetik. Misalnya cd / home / nama pengguna / Downloads sama dengan cd ~ / Downloads, tetapi kurang mengetik. Kedua perintah melakukan hal yang sama, ubah direktori kerja ke lokasi itu.

Ionut
sumber
Tidak juga. rootDirektori rumah Eg biasanya di luar/home
Dmitry Grigoryev