Saya mencoba untuk mengekstrak bagian berbeda dari installer perpustakaan Nvidia cuda. Saya menggunakan perintah berikut:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Dan saya mendapatkan pesan berikut:
ERROR: extract: path must be absolute.
Dan ketika saya mengetik perintah dengan alamat literal rumah saya, itu berfungsi dengan baik.
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Saya tidak boleh bingung ~ sama dengan / home / like-open / XXX / username?
Diuji:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
dan itu berhasil, tetapi saya tidak tahu mengapa itu tidak memungkinkan ~
command-line
paths
Regan
sumber
sumber
Jawaban:
Bash hanya mengembang ~ jika itu awal kata. Anda dapat melihat ini di antara perintah berikut:
Bash mencari
~
karakter mandiri dan~/
substitusi ini. Tidak ada kombinasi lain atau versi yang dikutip akan bekerja.$HOME
berfungsi karena substitusi variabel lebih kuat ($
ini adalah karakter khusus sedangkan~
sangat kurang begitu):Sementara kita berbicara tentang
~
, itu sebenarnya memiliki beberapa kegunaan substitusi lain:~+
direktori kerja saat ini (baca dari$PWD
)~-
direktori kerja sebelumnya (baca dari$OLDPWD
)Seperti biasa
~
, ini dapat memiliki jalur tambahan yang ditempel di akhir, dan sekali lagi, ini harus menjadi awalan untuk sebuah kata atau Bash akan mengabaikannya.Anda dapat membaca lebih lanjut tentang ini di
man bash | less -p ' Tilde'
sumber
zsh
tidak (atau lebih tepatnya dapat dikonfigurasi untuk) berkembang~
setelahnya=
juga. Di antara peningkatan nyaman lainnya yang dimilikinya lebih dari bash.=
; ini adalah tentang ekspansi pada awal sisi kanan dari penugasan variabel. Itu membuat kasus kami sedikit lebih membingungkan ketika melihat lebih dekat - lihat jawaban saya. Danzsh
tidak berbedabash
dengan ini; Deskripsi untuk 'zsh' sedikit samar:info --subnodes zsh | less +/'14.7.4 Notes'
(halaman buku zsh hilang)zsh
sangat bisa dikonfigurasi. Diecho -extract=~/test
hasil zsh saya di-extract=/home/user/test
. Ini diaktifkan olehMAGIC_EQUAL_SUBST
opsi. Sebagai catatan, saya memiliki semua halaman manual zsh dengan baik.zsh
dapat dikonfigurasi - dan peningkatan lainnya; Saya berharap bahwa MAGIC_EQUAL_SUBST (tercakup dalam 14.7.4) tidak disetel secara default, dan jarang digunakan; Sekarang, ini jelas lebih relevan jika Anda mengaktifkannya secara umum. Setelah saya mendapatkan bagian contoh saya dalam kondisi yang baik, itu akan menjadi tambahan yang bagus ...Hanya memperbaikinya
Perintah ini menunjukkan pesan kesalahan "ERROR: extract: path must absolute":
Kesalahan tidak membantu - programnya sudah terlalu bingung.
Anda sudah tahu kesalahan berasal dari
~
, karena berfungsi$HOME
sebagai gantinya.Masalahnya:
~
hanya akan diganti pada awal kata.Misalnya, ini berfungsi dengan tilde:
Jika Anda memerlukan sintaks opsi
=
, menggunakan $ HOME dan bukan~
merupakan solusi yang paling bersih;Latihan
Apa yang harus Anda ketahui:
Ada kasus khusus di mana
~
get diperluas ketika tidak di awal kata: sebagai bagian dari penugasan variabel, langsung setelah=
. Yang membingungkan di sini, tentu saja.Kasus khusus penting lainnya untuk digunakan dengan variabel seperti PATH. Dalam penugasan variabel,
~
juga diperluas setelah:
, seperti setelah yang pertama=
.Arti dari tilde
Dalam sebuah shell,,
~
tilde, sebenarnya bukan jalan. Itu hanya digantikan oleh jalan,$HOME
,, beberapa kali.Itu adalah sesuatu seperti steno, atau singkatan, yang disediakan oleh shell.
Itu tidak dapat digunakan seperti jalan pada umumnya, shell "memperluas" ke jalan hanya di tempat yang sangat khusus.
Dan bahkan jika itu diperluas, itu bisa ke sesuatu yang lain dari direktori home.
:
atau=
$HOME
jika tidak ada karakter lebih lanjut dalam kata sebelum a/
Masalahnya di baris perintah
Menurut ini, masalah dalam perintah Anda adalah bahwa tilde masuk
-extract=~/Downloads/nvidia_installers
tidak diperluas, karena itu bukan salah satu kasus yang terdaftar. Itu saja.
Solusinya bisa menjadikan tilde karakter tanpa tanda kutip pertama dari sebuah kata, tanpa karakter lain sebelum yang berikutnya
/
- itulah yang Anda dapatkan saat menggunakan opsi dengan spasi sebelum argumen opsi:-extract ~/Downloads/nvidia_installers
Solusi lain akan digunakan
$HOME
sebagai gantinya. Dalam naskah, itu biasanya pilihan yang lebih baik.-extract=$HOME/Downloads/nvidia_installers
Pesan kesalahan
Tapi bagaimana pesan kesalahannya
"ERROR: extract: path must be absolute."
?cocok dengan semua ini?
Kita tahu bahwa tilde tidak berkembang. Itu berarti program mendapatkan teks argumen termasuk
~
, tetapi tanpa/home/auser
path. Jalan itu~/Downloads/nvidia_installers
- tetapi sekarang tidak ada shell, jadi tilde tidak memiliki arti khusus. Itu hanya nama direktori normal. Dan seperti setiap jalur bentuk lainnyafoo/bar/baz
, itu adalah jalur relatifPenggunaan lainnya
Jika ada karakter setelah
~
, seperti di~alice
- dengan semua aturan lain di atas berlaku - dan ada nama penggunaalice
, yang diperluas ke direktori homealice
, katakanlahhome/alice
.Juga, jika Anda
bob
,~
akan memperluas ke/home/bob
, dan~bob
akan memperluas ke yang sama.Varian
~+
diperluas ke direktori saat ini,$PWD
Untuk merujuk ke direktori sebelumnya, di mana Anda berada sebelum yang terakhir
cd
, Anda dapat menggunakan~-
, yang diperluas ke$OLDPWD
.Jika Anda menggunakan
pushd
danpopd
, alih-alihcd
, Anda sudah akan tahu bahwa tumpukan direktori dapat diakses seperti~-2
.Detail
Semua case di mana
~
diperluas ke path handeled oleh shell . Untuk program lain,~
hanya karakter nama file normal.Untuk definisi yang tepat di dalam shell, di sini adalah bagian yang relevan dari Catatan bagaimana mengganti dengan hanya satu kasus khusus dari banyak kasus: "Jika nama login ini adalah string nol, tilde diganti dengan nilai parameter shell HOME. " :
man bash
~
$HOME
sumber
~
bukan jalan per se. Ini adalah karakter yang mendapat perlakuan khusus dari shell di mana~
atau~/
berarti "ganti dengan jalur direktori home pengguna saat ini".~username
berarti "ganti dengan jalur direktori home nama pengguna".Karena itu bukan jalan, itu hanya dikenali di tempat-tempat tertentu dalam perintah (sebagai karakter pertama dari token pemisah ruang baru).
Ketika diperluas, itu diganti dengan jalur absolut.
Menggunakan
$HOME
karya karena HOME hanya variabel yang diatur oleh shell dan mengikuti aturan shell normal untuk penggantian variabel (itu terjadi sebelum input dibagi pada spasi dan dieksekusi).sumber
Anda benar. ~ / Unduhan sama dengan / home / nama pengguna / Unduhan.
Beberapa installer dan extractors sangat pilih-pilih di mana perlu meletakkan sesuatu. Saya pikir itu mungkin karena log filepath, dan log tidak akan menerima ~ di jalur yang diterima.
Saya terbiasa mengetik / home / username saja. :)
sumber