Тильда, '~' считал относительным путем?

Я пытаюсь извлечь другую часть 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

и это работает, но я не знаю, почему это не позволяет ~

35
задан 6 November 2016 в 16:31

4 ответа

Bash только разворачивает ~, если это - начало слова. Вы видите это между следующими командами:

$ echo -extract=~/test
-extract=~/test

oli@bert:~$ echo -extract ~/test
-extract /home/oli/test

Bash ищет автономный ~ символы и ~/ для этой замены. Никакая другая комбинация или заключенная в кавычки версия не будут работать.

$HOME работы, потому что подстановки переменных более устойчивы ( $ специальный символ тогда как ~ намного меньше):

$ echo Thisisastring${HOME}awrawr
Thisisastring/home/oliawrawr

В то время как мы говорим о ~, это на самом деле имеет еще несколько другого использования замены:

  • ~+ текущий рабочий каталог (чтение от $PWD)
  • ~- предыдущий рабочий каталог (чтение от $OLDPWD)

Как с плоскостью ~, им можно было прикрепить дополнительные пути на конце, и снова, они должны быть префиксом к слову, или Bash проигнорирует их.

Можно читать больше об этом в man bash | less -p ' Tilde'

47
ответ дан 23 November 2019 в 00:25

~ не путь по сути. Это - символ, который получает специальный режим от оболочки, где ~ или ~/ означает "замену путем корневого каталога текущего пользователя". ~username означает "замену путем корневого каталога имени пользователя".

, поскольку это не путь, это только распознано в определенных местах в команде (как первый символ нового разделенного на пространство маркера).

, Когда расширено, это это заменило полным путем.

Используя $HOME работы, потому что ДОМОЙ просто переменная, установленная оболочкой, и следует нормальным правилам оболочки для переменной замены (это происходит, прежде чем вход разделяется на пробелах и выполняется).

3
ответ дан 23 November 2019 в 00:25

Вы корректны. ~ / Загрузки совпадает с/home/username/Downloads.

Некоторые установщики и экстракторы просто очень требовательны в отношении того, куда это должно поместить вещи. Я думаю, что это могло бы быть, потому что это регистрирует filepaths, и привычка журналов принимает ~ в принятом пути.

я просто привык к вводу в/home/username вместо этого.:)

1
ответ дан 23 November 2019 в 00:25

Просто фиксация его

Эта команда показывает сообщение об ошибке "ОШИБКА: извлечение: путь должен быть полным":

./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers

Ошибка не полезна - программа уже была слишком перепутана.
Вы уже знаете, что ошибка от ~, поскольку это работает с $HOME вместо этого.

Проблема: ~ только заменяется в начале слова.

Например, это работает с тильдой:

echo -extract ~/Downloads

Если Вам нужен синтаксис опции с =, использование $HOME вместо ~ самое чистое решение;

echo -extract=$HOME/Downloads

Практика

Что необходимо знать:

Существуют особые случаи где ~ доберитесь расширился если не в начале слова: как часть переменного присвоения, непосредственно после =. Который сбивает с толку здесь, конечно.

Другой важный особый случай это для использования с переменными как ПУТЬ. В переменных присвоениях, ~ также расширен после :, как после первого =.

$ 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.

Подробнее

Все случаи, где ~ расширен до пути, handeled оболочкой. Для других программ, ~ просто нормальный символ имени файла.

Для точного определения в оболочке вот соответствующий раздел 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.
19
ответ дан 23 November 2019 в 00:25

Другие вопросы по тегам:

Похожие вопросы: