Bagaimana cara menggunakan tilde berfungsi sebagai pintasan ke direktori home saya?

30

Saya bingung, mencoba menyalin beberapa file dari satu PC ke yang lain. Saya sudah menemukan jawabannya, tetapi sintaksinya masih membingungkan bagi saya. Ini bekerja:

scp ~/Desktop/Volenteer.png jay@server.ip:~j0h/b

yang menempatkan Volenteer.pngdi folder /home/j0h/b. Namun, ini tidak berhasil:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Ini juga gagal, memberikan file status keluar 1 tidak ditemukan:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

Seperti ini:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

Jadi jelas, ada beberapa perbedaan antara ~dan ~/ Perbedaan itu adalah kehadiran/

$~/
bash: /home/j0h/: Is a directory
$ ~
bash: /home/j0h: Is a directory

Jadi mengapa di scp, apakah ~tekadnya ~/? Itu dugaan, saya tidak dapat memverifikasi itulah yang terjadi. Tetapi tampaknya tidak konsisten, dan karenanya membingungkan. Apakah ini bug di scp? atau adakah sesuatu tentang tilde yang saya lewatkan?

j0h
sumber
2
Hanya catatan tambahan di sini, itu dieja "sukarelawan", dengan "u" bukannya "e" :)
AER
2
Saya seorang pengeja liberal.
j0h
Pertanyaan terkait: askubuntu.com/q/972319/295286
Sergiy Kolodyazhnyy

Jawaban:

68

~ adalah direktori home Anda.

~fooadalah direktori home pengguna foo, jika pengguna seperti itu ada, atau hanya direktori bernama ~foo, jika pengguna itu tidak ada.


Karenanya, dalam:

scp ~Desktop/Volenteer.png     jay@server.ip:~j0h/b

~Desktopakan diperluas ke direktori home pengguna Desktop, jika ada pengguna (dan biasanya tidak), atau hanya ~Desktop(jalur yang biasanya tidak ada).


Di:

scp ~/Desktop/Volenteer.png     jay@server.ip:~/j0h/b

~/j0hakan memperluas ke direktori bernama j0hdi jaydirektori home, yang, sekali lagi, tidak mungkin ada.


Bukan ~dan di ~/mana perbedaan terjadi, tetapi di ~dan ~foo.


Selain itu, ~juga dapat digunakan untuk navigasi riwayat direktori:

  • ~-adalah direktori kerja sebelumnya (seperti $OLDPWD)
  • ~+adalah direktori kerja saat ini (seperti $PWD)

Ini tidak berlaku untuk scp, karena Anda tidak bisa mengubah direktori di tengah scpoperasi.

Dan jika Anda menggunakan pushddanpopd memelihara tumpukan direktori, dan akan menjadi direktori ke-3 di tumpukan direktori, seperti yang terlihat pada output . akan menjadi direktori th dari akhir (menghitung dari nol, dalam kedua kasus). Sebagai contoh:~N~+NNdirs~-NN

$ for i in etc usr var tmp; do pushd /$i; done
/etc ~/.vim
/usr /etc ~/.vim
/var /usr /etc ~/.vim
/tmp /var /usr /etc ~/.vim

$ dirs
/tmp /var /usr /etc ~/.vim

Kemudian, direktori dalam stack dapat diakses menggunakan:

/tmp /var /usr /etc ~/.vim
  ~0   ~1   ~2   ~3     ~4
 ~+0  ~+1  ~+2  ~+3    ~+4
 ~-4  ~-3  ~-2  ~-1    ~-0 
  ~+   ~-
muru
sumber
Jadi, ~+selalu sama dengan .itu, benarkah itu? Tampaknya berlebihan.
Wildcard
1
@ Kartu Memori juga, tidak persis. ~+dan ~-gunakan nilai-nilai $PWDdan $OLDPWD, yang merupakan jalur absolut. .selalu merupakan jalur relatif. Jadi, jika ada perintah yang mengubah direktori kerja saat ini ketika mengeksekusi, itu akan melihat jalur baru ., di mana jalur yang diperluas ~-akan tetap sama. tar -Cadalah contoh, meskipun saya akui saya tidak bisa memikirkan gunanya ~+. $PWDakan sama baiknya, kecuali bahwa Anda tidak perlu mengutip ~+/foo/barjika $PWDberisi spasi.
muru
1
Terima kasih, itu memperjelasnya. Sebenarnya itu adalah contoh kasus penggunaan yang baik di sana: Beberapa perintah menolak untuk beroperasi di jalur relatif karena alasan keamanan; dengan perintah seperti itu Anda tidak dapat menggunakan ./filenametetapi bisa menggunakan "$PWD/filename"atau lebih sederhana ~+/filename. (Dan beberapa perintah akan bekerja pada nama path relatif tetapi ada perbedaan fungsional, seperti lnatau tar.)
Wildcard
21

Bacalah dokumentasi GNU untuk Bash Tilde Expansion (seperti yang seharusnya saya lakukan sebelum iterasi pertama saya untuk jawaban ini).

~/Desktopdan ~j0hmelakukan hal-hal yang secara fundamental berbeda, yang menjelaskan mengapa ~Desktoptidak bekerja:

  • Polos ~diganti untuk $HOMEvariabel lingkungan Anda saat ini , ditetapkan saat login. Jadi ~putuskan untuk /home/oliuntuk saya, dan ~/Desktopdibaca sebagai /home/oli/Desktop. Di sinilah Anda melihat tilda yang paling banyak digunakan.

  • ~usernamemenyelesaikan ke rumah pengguna itu , sebagaimana diatur dalam /etc/passwd. Jadi ~oliputuskan untuk /home/oli, ~j0hmungkin putuskan /home/j0htetapi tidak perlu, homedir Anda bisa ada di mana saja.

  • ~not-a-usernametidak menyelesaikan. Karena Desktopbukan pengguna, ~Desktoptidak diganti. Itu diambil secara harfiah sebagai file atau jalur bernama ~Desktop(yang tidak ada di sini).

Dan tak perlu dikatakan, ini semua terjadi dari jarak jauh (itu akan sia-sia scpjika diganti dengan nilai-nilai lokal). Ini berfungsi karena Bash tidak akan menggantikan ~...jika itu didahului oleh apa pun kecuali spasi.

Oli
sumber
Apa yang getent passwd bindikatakan?
muru
2
"bin" adalah pengguna sistem pada sebagian besar mesin Linux, dengan direktori home / bin.
fNek
1
Kegagalan untuk memperluas ~dirkonsisten dengan dokumen GNU: "... karakter dalam awalan tilde mengikuti tilde diperlakukan sebagai nama login yang mungkin ... Jika nama login tidak valid, atau ekspansi tilde gagal, kata dibiarkan tidak berubah. " Di sini, dirbukan nama pengguna pada sistem ini, jadi tidak berubah.
apsillers
Terima kasih semuanya. Saya mungkin harus membaca tautan yang saya posting :)
Oli
4

Simbol ~digunakan sebagai jalan pintas untuk /home/usermasuk bash, jadi dalam kasus ~/Desktop/Volenteer.pngitu adalah singkatan /home/user/Desktop/Volenteer.png.

Jadi seperti yang Anda lihat /, seperti biasa, menunjukkan level baru dalam hierarki sistem file.

Mark Kirby
sumber
3
hanya setengah benar, ini adalah singkatan untuk variabel lingkungan $ HOME. ~{user}/bisa berupa jalur acak apa pun yang ditetapkan oleh file database passwd (5). Sementara ya, standar filesytem.org memang menempatkan pengguna reguler di / home, ini tidak berlaku untuk setiap pengguna (yaitu root di / root, dan layanan di / var / ... atau unixies lama menggunakan / usr, bukan / home)
Dwight Spencer
DwightSpencer benar. Saya memelihara beberapa server di mana pengguna berada di / usr / {CLIENTNAME} / home / dan dibagi melalui beberapa sistem internal dan jarak jauh (semuanya mengarah ke direktori itu) sehingga hanya 1 sistem yang perlu dipertahankan. Dan ~ menunjuk ke direktori itu;)
Rinzwind
3
@Rinzwind eek. Saya harus memprotes penyalahgunaan asusila ini /usr.
muru
@muru hei itu bukan panggilan SAYA>: - D Itu adalah sisa dari SCO D:
Rinzwind
1
Jujur saya suka penggunaan / usr untuk semua hal pengguna karena itulah yang awalnya dimaksudkan. Apa yang saya temukan hari ini adalah penyalahgunaan / usr / bin yang lebih asusila sebagai tempat pembuangan terpadu yang besar dari semua binari (sys, user, sysop) di luar basis binutils. Setelah semua / usr dimaksudkan sebagai semua hal yang dapat diakses pengguna dari nfs mount sementara / usr / local adalah ruang pengguna lokal dengan / sbin sebagai binari sysop dan / bin sistem bin. Saya mendapatkan bahwa / home dapat berupa partisi yang berbeda tetapi begitu juga / usr / home / ... menyimpannya di / usr menyimpannya sebagai namespace pengguna baik dalam kebijakan, implementasi, dan pola pikir.
Dwight Spencer
3

~adalah singkatan untuk variabel lingkungan $HOMEpada sebagian besar c shell turunan / mendukung POSIX. penggunaan paling umum ~adalah ketika merujuk direktori home Anda sendiri atau direktori home user lain:

cd ~ # ie shell, take me to my home folder

cd ~root # i.e. shell, take me to root's home folder

Untuk menemukan direktori home untuk setiap pengguna lokal pada sistem POSIX (UNIX, Linux, OS X, BSD) yang menggunakan passwd (5) database jalankan awk /etc/passwdseperti:

awk -F: '{ print $1,$(NF-1) }' /etc/passwd

Ini akan mencantumkan setiap pengguna lokal dan direktori home mereka.

Dwight Spencer
sumber