Hanya memperbaikinya
Perintah ini menunjukkan pesan kesalahan "ERROR: extract: path must absolute":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
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:
echo -extract ~/Downloads
Jika Anda memerlukan sintaks opsi =
, menggunakan $ HOME dan bukan ~
merupakan solusi yang paling bersih;
echo -extract=$HOME/Downloads
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 =
.
$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2:
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2:
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2:
$ echo d3: $d3
d3: /home/user
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.
- Ini hanya diperluas di awal kata , atau dalam penugasan variabel setelah
:
atau=
- Hanya diperluas jika itu tidak ada di dalam tanda kutip
- Hanya diperluas ke
$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 relatif
Penggunaan lainnya
Jika ada karakter setelah ~
, seperti di ~alice
- dengan semua aturan lain di atas berlaku - dan ada nama pengguna alice
, yang diperluas ke direktori home alice
, katakanlah home/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
dan popd
, alih-alih cd
, 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
Tilde Expansion
If a word begins with an unquoted tilde character (`~'), all of the charac‐
ters preceding the first unquoted slash (or all characters, if there is no
unquoted slash) are considered a tilde-prefix. If none of the characters
in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
ing the tilde are treated as a possible login name. If this login name is
the null string, the tilde is replaced with the value of the shell parame‐
ter HOME. If HOME is unset, the home directory of the user executing the
shell is substituted instead. Otherwise, the tilde-prefix is replaced with
the home directory associated with the specified login name.
If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell
variable OLDPWD, if it is set, is substituted. If the characters following
the tilde in the tilde-prefix consist of a number N, optionally prefixed by
a `+' or a `-', the tilde-prefix is replaced with the corresponding element
from the directory stack, as it would be displayed by the dirs builtin
invoked with the tilde-prefix as an argument. If the characters following
the tilde in the tilde-prefix consist of a number without a leading `+' or
`-', `+' is assumed.
If the login name is invalid, or the tilde expansion fails, the word is
unchanged.
Each variable assignment is checked for unquoted tilde-prefixes immediately
following a : or the first =. In these cases, tilde expansion is also per‐
formed. Consequently, one may use filenames with tildes in assignments to
PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.