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?
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?
Jawaban:
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 $HOME
var, atau melakukan dua cd
s. Juga untuk menyalin atau memindahkan file:
$ cp ~/downloads/some-file some/path/
Karena sebagian besar file Anda ada di rumah, selalu ada jalan pintas.
~
adalah yang harus dilakukan cd ~user/download
untuk pergi ke direktori unduhan pengguna.
Melakukan cd
pada dasarnya memanggil cd
tanpa argumen dan sesuai dengan cd
perilaku "... jika dir tidak diberikan, nilai variabel shell HOME adalah default." (dari manual bash ). Sebaliknya, cd ~
adalah ketika Anda memberikan argumen ke cd
perintah, yang kebetulan ~
dan shell akan melakukan ekspansi tilde . Sejauh kembali ke direktori home pengguna - tidak ada perbedaan. Dalam kedua kasus, HOME
variabel 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 cd
akan melakukan satu-satunya hal, tilde dapat digunakan untuk melakukan ekspansi lain seperti ~+
untuk direktori kerja saat ini.
Namun, cukup menarik kita bisa unset HOME
untuk istirahat cd
tetapi ~
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 HOME
string kosong memecah tilde dan cd
perilaku.
Tilde dan $HOME
memiliki sedikit perbedaan dan alasan berbeda untuk keberadaan. $HOME
adalah variabel shell, yang kebetulan juga merupakan salah satu variabel lingkungan - dan tersedia untuk semua program; di C Anda akan menggunakannya environ()
untuk mengaksesnya. Sebaliknya, tilde
adalah 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 HOME
telah dijawab dalam pertanyaan ini : pada suatu waktu karakter tilde berbagi kunci yang sama dengan HOME
pada terminal Lear-Siegler ADM-3A. HOME
sebaliknya adalah variabel lingkungan yang memiliki makna simbolis murni dan tidak ada representasi fisik.
Selain itu, fakta bahwa itu HOME
adalah 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 echo
menampilkan 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 HOME
tidak 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 HOME
tetap 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
,, dash
dan csh
- semua berperilaku sama dengan cd
atau 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.
Terlepas dari apakah Anda beberapa level folder di atas atau di bawah $HOME
, perintah cd
dan 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 $HOME
saat mengetik cd
perintah. 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
~ 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.
root
Direktori rumah Eg biasanya di luar/home
cd ~
vscd $HOME
vscd ~not-tandu
. Pertanyaan ini bertanya tentangcd
vscd ~
.