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.png
di 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?
Jawaban:
~
adalah direktori home Anda.~foo
adalah direktori home penggunafoo
, jika pengguna seperti itu ada, atau hanya direktori bernama~foo
, jika pengguna itu tidak ada.Karenanya, dalam:
~Desktop
akan diperluas ke direktori home penggunaDesktop
, jika ada pengguna (dan biasanya tidak), atau hanya~Desktop
(jalur yang biasanya tidak ada).Di:
~/j0h
akan memperluas ke direktori bernamaj0h
dijay
direktori 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 tengahscp
operasi.Dan jika Anda menggunakan
pushd
danpopd
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
~+N
N
dirs
~-N
N
Kemudian, direktori dalam stack dapat diakses menggunakan:
sumber
~+
selalu sama dengan.
itu, benarkah itu? Tampaknya berlebihan.~+
dan~-
gunakan nilai-nilai$PWD
dan$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 -C
adalah contoh, meskipun saya akui saya tidak bisa memikirkan gunanya~+
.$PWD
akan sama baiknya, kecuali bahwa Anda tidak perlu mengutip~+/foo/bar
jika$PWD
berisi spasi../filename
tetapi bisa menggunakan"$PWD/filename"
atau lebih sederhana~+/filename
. (Dan beberapa perintah akan bekerja pada nama path relatif tetapi ada perbedaan fungsional, sepertiln
atautar
.)Bacalah dokumentasi GNU untuk Bash Tilde Expansion (seperti yang seharusnya saya lakukan sebelum iterasi pertama saya untuk jawaban ini).
~/Desktop
dan~j0h
melakukan hal-hal yang secara fundamental berbeda, yang menjelaskan mengapa~Desktop
tidak bekerja:Polos
~
diganti untuk$HOME
variabel lingkungan Anda saat ini , ditetapkan saat login. Jadi~
putuskan untuk/home/oli
untuk saya, dan~/Desktop
dibaca sebagai/home/oli/Desktop
. Di sinilah Anda melihat tilda yang paling banyak digunakan.~username
menyelesaikan ke rumah pengguna itu , sebagaimana diatur dalam/etc/passwd
. Jadi~oli
putuskan untuk/home/oli
,~j0h
mungkin putuskan/home/j0h
tetapi tidak perlu, homedir Anda bisa ada di mana saja.~not-a-username
tidak menyelesaikan. KarenaDesktop
bukan pengguna,~Desktop
tidak 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
scp
jika diganti dengan nilai-nilai lokal). Ini berfungsi karena Bash tidak akan menggantikan~...
jika itu didahului oleh apa pun kecuali spasi.sumber
getent passwd bin
dikatakan?~dir
konsisten 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,dir
bukan nama pengguna pada sistem ini, jadi tidak berubah.Simbol
~
digunakan sebagai jalan pintas untuk/home/user
masukbash
, jadi dalam kasus~/Desktop/Volenteer.png
itu adalah singkatan/home/user/Desktop/Volenteer.png
.Jadi seperti yang Anda lihat
/
, seperti biasa, menunjukkan level baru dalam hierarki sistem file.sumber
~{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)/usr
.~
adalah singkatan untuk variabel lingkungan$HOME
pada sebagian besar c shell turunan / mendukung POSIX. penggunaan paling umum~
adalah ketika merujuk direktori home Anda sendiri atau direktori home user lain:Untuk menemukan direktori home untuk setiap pengguna lokal pada sistem POSIX (UNIX, Linux, OS X, BSD) yang menggunakan passwd (5) database jalankan awk
/etc/passwd
seperti:Ini akan mencantumkan setiap pengguna lokal dan direktori home mereka.
sumber