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

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

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

1
задан 7 November 2016 в 03:31

3 ответа

Только исправление

Эта команда показывает сообщение об ошибке «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.
19
ответ дан 24 May 2018 в 04:15

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

Поскольку это не путь, он распознается только в определенных местах в команде (в качестве первого символа нового маркера с пространственным разделением). [ ! d1]

При расширении он заменяется абсолютным путем.

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

3
ответ дан 24 May 2018 в 04:15

Вы правы. ~ / Downloads - это то же самое, что /home/username/Downloads.

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

Я просто привык вводить / home / username. :

)
1
ответ дан 24 May 2018 в 04:15

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

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