Просто фіксуючи це
Ця команда показує повідомлення про помилку "ПОМИЛКА: extract: шлях повинен бути абсолютним":
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Помилка не є корисною - програма вже була занадто заплутана.
Ви вже знаєте, що помилка з боку ~
, як це працює $HOME
замість цього.
Проблема: ~
замінюється лише на початку слова.
Наприклад, це працює з тильдою:
echo -extract ~/Downloads
Якщо вам потрібен синтаксис опцій з =
, використання $ HOME замість, ~
є найчистішим рішенням;
echo -extract=$HOME/Downloads
Практика
Що ви повинні знати:
Існують спеціальні випадки, коли ~
розгортання отримується, коли не на початку слова: як частина змінної задачі, безпосередньо після =
. Звичайно, що тут заплутано.
Інший важливий особливий випадок - це для використання зі змінними на зразок PATH. У змінних призначеннях ~
також розширюється після :
, як і після першого =
.
$ 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
Значення тильди
В оболонці ~
тильда насправді не є стежкою. Він замінюється лише стежкою $HOME
, в деяких випадках.
Це щось на зразок скорочення, або абревіатури, наданої оболонкою.
Його не можна використовувати як шлях взагалі, оболонка «розширює» його на шлях лише в дуже спеціальних місцях.
І навіть якщо він розширений, це може бути щось інше, ніж домашній каталог.
- Він розгортається лише на початку слова або у призначенні змінної після a
:
або=
- Він розширюється лише в тому випадку, якщо він не знаходиться всередині лапок
- Він розширюється лише до того,
$HOME
якщо в слові до слова "a" немає додаткових символів/
Проблема в командному рядку
Згідно з цим проблема вашої команди полягає в тому, що тильда в
-extract=~/Downloads/nvidia_installers
не розширюється, оскільки це не один із перелічених випадків. Це все.
Рішення може полягати в тому, щоб зробити тильду першим котируваним символом слова, не маючи іншого символу перед наступним, /
- це саме те, що ви отримуєте, використовуючи параметр з пробілом перед аргументом параметра:
-extract ~/Downloads/nvidia_installers
Іншим рішенням буде $HOME
замість цього використовувати . За сценарієм, це, як правило, кращий вибір.
-extract=$HOME/Downloads/nvidia_installers
Повідомлення про помилку
Але як повідомлення про помилку
"ERROR: extract: path must be absolute."
?
вписатись у все це?
Ми знаємо, що тильда не розширилася. Це означає, що програма отримала текст аргументу, включаючи ~
, але без /home/auser
шляху. Цей шлях є ~/Downloads/nvidia_installers
- але тепер немає оболонки, тому тильда не має особливого значення. Це просто звичайна назва каталогу. І як і будь-який інший шлях форми foo/bar/baz
, це відносний шлях
Інші види використання
Якщо після символу є символи ~
, як у ~alice
- з усіма іншими правилами, наведеними вище, - а також є імена користувачів alice
, які alice
замість нього розширюються на домашній каталог home/alice
.
Крім того, якщо ви є bob
, ~
то розширитесь /home/bob
і ~bob
на те саме.
Варіант ~+
розширено до поточного каталогу,$PWD
Для посилання на попередній каталог, де ви були до останнього cd
, ви можете використовувати ~-
, до якого розширено $OLDPWD
.
Якщо ви використовуєте pushd
і popd
замість цього cd
, ви вже будете знати, що до стека каталогів можна отримати доступ ~-2
.
Деталі
Усі випадки, коли ~
розширений шлях , обробляються оболонкою . Для інших програм - ~
це лише звичайний символ файлу.
Для точного визначення всередині оболонки, ось відповідний розділ
Примітки, як заміна на лише один особливий випадок багатьох випадків: "Якщо це ім'я для входу є нульовим рядком, тильда замінюється значенням параметра оболонки 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.