Я пытаюсь извлечь другую часть установщика библиотеки Nvidia cuda. Я использую следующую команду:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
И я получаю следующее сообщение:
ERROR: extract: path must be absolute.
И когда я набираю команду с литеральным адресом моего дома, она работает
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Я запутался, не должен быть тем же самым из / home / likewise-open / XXX / username?
Протестировано:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
, и он работает, но я не знаю, почему это не позволяет ~
Эта команда показывает сообщение об ошибке «ERROR: extract: путь должен быть абсолютным»:
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Ошибка не помогает - программа тоже смущен уже. Вы уже знаете, что ошибка происходит от ~, поскольку она работает с $HOME.
Проблема: ~ заменяется только в начале слова.
Например, это работает с тильдой:
echo -extract ~/Downloads
Если вам нужен синтаксис опции с =, то использование $ HOME вместо ~ является самым чистым решением ;
echo -extract=$HOME/Downloads
Что вы должны знать:
Существуют особые случаи, когда ~ get расширяется, если не в начале слова: как часть присваивания переменной, непосредственно после =. Это, конечно, запутывает.
Другой важный частный случай для использования с такими переменными, как 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
В оболочке [ f16], тильда, на самом деле не путь.
Это что-то вроде сокращения или сокращения, предоставленного оболочкой. Он не может быть использован как путь вообще, оболочка «расширяет» его до пути только в очень особых местах. И даже если он расширен, это может быть что-то другое, чем домашний каталог.
Он расширяется только в начале слова или в присваивании переменной после : или =. Он расширяется только в том случае, если он не внутри кавычек. Он расширяется только до $HOME если в слове нет дополнительных символов до /В соответствии с этим проблема в вашей команде заключается в том, что тильда в
-extract=~/Downloads/nvidia_installers
не расширяется, потому что это не один из перечисленных случаев. Это все.
Решение может состоять в том, чтобы сделать тильду первым неупорядоченным символом слова без какого-либо другого символа перед следующим / - это именно то, что вы получаете, когда используете параметр с space перед аргументом опции:
-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.
Все случаи, когда ~ расширяются до пути, рукояткой оболочки. Для других программ ~ является обычным символом имени файла.
Для помещены оболочкой внутри оболочки, вот соответствующий раздел man bash. Обратите внимание, что замена ~ на $HOME - это только один частный случай многие случаи: «Если это имя для входа является пустой строкой, тильда заменяется значением параметра оболочки 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.
~ - это не путь как таковой. Это символ, который получает специальную обработку от оболочки, где ~ или ~/ означает «заменить на текущий путь к домашнему каталогу пользователя». ~username означает «заменить путь к домашнему каталогу пользователя».
Поскольку это не путь, он распознается только в определенных местах в команде (в качестве первого символа нового маркера с пространственным разделением). [ ! d1]
При расширении он заменяется абсолютным путем.
Использование $HOME работает, потому что HOME - это просто переменная, заданная оболочкой, и следует нормальным правилам оболочки для замены переменных (это происходит перед тем как вход разделяется на пробелы и выполняется).
Вы правы. ~ / Downloads - это то же самое, что /home/username/Downloads.
Некоторые инсталляторы и экстракторы просто очень разборчивы в том, где это нужно, чтобы поместить вещи. Я думаю, это может быть потому, что он регистрирует пути к файлам, и журналы не принимают ~ в принятом пути.
Я просто привык вводить / home / username. :
)