Я пытаюсь извлечь другую часть установщика библиотеки 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
и это работает, но я не знаю, почему это не позволяет ~
command-line
paths
Regan
источник
источник
Ответы:
Bash расширяет только ~, если это начало слова. Вы можете увидеть это между следующими командами:
Bash ищет автономных
~
персонажей и~/
эту замену. Никакая другая комбинация или цитируемая версия не будут работать.$HOME
работает, потому что подстановки переменных более устойчивы ($
это специальный символ, тогда как~
это очень мало):Пока мы говорим об этом
~
, на самом деле есть еще пара других замен:~+
текущий рабочий каталог (читать из$PWD
)~-
предыдущий рабочий каталог (читать из$OLDPWD
)Как и в случае с обычным
~
, они могут иметь дополнительные пути в конце, и опять же, они должны быть префиксом слова, иначе Bash их проигнорирует.Вы можете прочитать больше об этом в
man bash | less -p ' Tilde'
источник
zsh
это (или , скорее , может быть настроен) расширяться~
после=
тоже. Среди других удобных улучшений - Bash.=
; речь идет о расширении в начале правой части присваивания переменной. Это делает наш случай немного более запутанным, если присмотреться - посмотрите мой ответ. Иzsh
ничем не отличается отbash
этого; Описание для zsh немного загадочно:info --subnodes zsh | less +/'14.7.4 Notes'
(отсутствуют страницы руководства zsh)zsh
очень настраиваемый. По моему зшecho -extract=~/test
результаты-extract=/home/user/test
. Это включеноMAGIC_EQUAL_SUBST
опциями. Напомним, что у меня есть все справочные страницы zsh.zsh
что можно настраивать - и другие улучшения; Я ожидал бы, что MAGIC_EQUAL_SUBST (описанный в 14.7.4) не установлен по умолчанию и используется редко; Теперь, очевидно, более уместно, если у вас это вообще включено. После того, как я приведу примерный раздел в хорошем состоянии, это будет хорошим дополнением ...Просто исправляю
Эта команда показывает сообщение об ошибке «ОШИБКА: извлечение: путь должен быть абсолютным»:
Ошибка не помогает - программа уже слишком запуталась.
Вы уже знаете, что ошибка от
~
, поскольку она работает$HOME
вместо этого.Проблема:
~
заменяется только в начале слова.Например, это работает с тильдой:
Если вам нужен синтаксис с опцией
=
, использование $ HOME вместо~
наиболее чистого решения;Практика
То, что вы должны знать:
Существуют особые случаи, когда
~
get расширяется, когда не в начале слова: как часть присваивания переменной, сразу после=
. Что, конечно, сбивает с толку.Другой важный особый случай - использование с такими переменными, как PATH. В переменных присваивается
~
также после:
, как и после первого=
.Смысл тильды
В скорлупе,
~
тильда, на самом деле не путь. Это только заменено путем,$HOME
несколько раз.Это что-то вроде сокращения или сокращения, предоставляемого оболочкой.
Его нельзя использовать как путь в целом, оболочка «расширяет» его до пути только в очень особых местах.
И даже если он расширен, он может быть чем-то другим, кроме домашнего каталога.
:
или=
$HOME
случае, если в слове нет следующих символов перед/
Проблема в командной строке
В соответствии с этим, проблема в вашей команде заключается в том, что тильда в
-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
источник
~
это не путь сам по себе. Это персонаж, который получает специальную обработку из оболочки, где~
или~/
означает «заменить на путь к домашнему каталогу текущего пользователя».~username
означает «заменить на путь к домашней директории пользователя».Поскольку это не путь, он распознается только в определенных местах команды (как первый символ нового токена с разделением пробелами).
При расширении он заменяется абсолютным путем.
Использование
$HOME
работает, потому что HOME - это просто переменная, установленная оболочкой, и она следует обычным правилам оболочки для замены переменных (это происходит до того, как ввод разделен на пробелы и выполнен).источник
Ты прав. ~ / Downloads такой же, как / home / username / Downloads.
Некоторые инсталляторы и экстракторы очень разборчивы в том, куда нужно поместить вещи. Я думаю, что это может быть потому, что он регистрирует пути к файлам, и журналы не принимают ~ по принятому пути.
Я просто привык вместо этого вводить / home / username. :)
источник