Почему я не мог использовать '~' вместо '/ home / username /' при предоставлении пути к файлу

Из документации sphinx

Установка пакетов Sphinx на Debian и Ubuntu

Существует два способа получения Sphinx для Ubuntu: обычные пакеты deb и репозиторий PPP Launchpad. [!d3 ]

Пакеты Deb:

Для Sphinx требуется несколько библиотек, которые будут установлены на Debian / Ubuntu. Используйте apt-get для загрузки и установки этих зависимостей:

$ sudo apt-get install mysql-client unixodbc libpq5

Теперь вы можете установить Sphinx:

$ sudo dpkg -i sphinxsearch_2.2.1-beta-0ubuntu11~precise_amd64.deb

репозиторий PPA (только для Ubuntu).

[d8 ] Установка Sphinx намного проще из репозитория Sphinxsearch PPA, потому что вы получите все зависимости и можете также обновить Sphinx до последней версии с помощью той же самой команды.

Сначала добавьте репозиторий Sphinxsearch и обновите список пакетов:

$ sudo add-apt-repository ppa:builds/sphinxsearch-daily
$ sudo apt-get update

Установить / обновить пакет sphinxsearch:

$ sudo apt-get install sphinxsearch

Демон поиска Sphinx можно запустить / остановить с помощью служебной команды:

$ sudo service sphinxsearch start

2.4. Установка пакетов Sphinx на RedHat и CentOS

В настоящее время мы распространяем Sphinx RPMS и SRPMS на нашем веб-сайте для версий 5x и 6.x Red Hat Enterprise Linux, но их также можно установить и в CentOS.

Перед установкой убедитесь, что у вас установлены эти пакеты:

$ yum install postgresql-libs unixODBC

Загрузите RedHat RPM с сайта Sphinx и установите его:

$ rpm -Uhv sphinx-2.2.1-1.rhel6.x86_64.rpm

После подготовки конфигурации файл (см. Quick tour), вы можете запустить демон поиска:

$ service searchd start
1
задан 10 March 2017 в 00:31

3 ответа

Расширение тильды в python

Ответ короткий и amp; simple:

python не расширяет ~, если вы не используете:

import os
os.path.expanduser('~/your_directory')

См. также здесь:

os.path.expanduser (path) On Unix и Windows возвращают аргумент с исходным компонентом ~ или ~ пользователя, замененным домашним каталогом этого пользователя. В Unix начальная ~ заменяется переменной среды HOME, если она установлена; в противном случае домашний каталог текущего пользователя просматривается в каталоге паролей через встроенный модуль pwd. Исходный ~ пользователь просматривается непосредственно в каталоге паролей.
30
ответ дан 23 May 2018 в 00:52
  • 1
    В общем, вы никогда не должны предполагать, что расширение тильды выполняется на уровне ОС, это то, что делает Unix-оболочки (и не все из них!) Для вас. – farsil 7 March 2017 в 14:10
  • 2
    Я думаю, что более релевантная проблема выровнена в ответе alexis: позиция ~ в списке аргументов оболочки. – David Foerster 7 March 2017 в 16:28
  • 3
    @farsil, я не согласен. Программы можно сделать переносимыми, но когда вы запускаете их из командной строки, вы делаете это в определенной системе. И давайте не будем забывать, что это askubuntu.com, и Ubuntu всегда является Unix (, насколько нам известно :-) – alexis 7 March 2017 в 16:52
  • 4
    @alexis: Ubuntu не делает расширения тильды на уровне ОС. Это все еще функциональность оболочки. – user2357112 8 March 2017 в 01:59
  • 5
    Кажется, вы раскалываете волосы. Никто не сказал, что ядро ​​это делает. Дело в том, что это не делается программой, которая принимает аргументы. – alexis 8 March 2017 в 03:45

Расширение Тильды выполняется только в нескольких контекстах, которые немного отличаются между оболочками.

Пока он выполняется в:

var=~

Или

export var=~

в некоторых оболочках. Это не в

echo var=~
env var=~ cmd
./configure --prefix=~

в оболочках POSIX.

Оно находится в bash, хотя не в режиме соответствия POSIX (например, при вызове как sh или когда POSIXLY_CORRECT находится в среде):

$ bash -c 'echo a=~'
a=/home/stephane
$ POSIXLY_CORRECT= bash -c 'echo a=~'
a=~
$ SHELLOPTS=posix bash -c 'echo a=~'
a=~
$ (exec -a sh bash -c 'echo a=~')
a=~

Однако только тогда, когда слева от = сформировано имя переменной без кавычек, поэтому, пока оно будет расширено в cmd prefix=~ это не будет в cmd --prefix=~ (поскольку --prefix не является допустимым именем переменной), ни в cmd "p"refix=~ (из-за этого цитируется p), ни в var=prefix; cmd $var=~.

В zsh, вы можете установить опцию magic_equal_subst для ~ для расширения после любого неуказанного =.

$ zsh -c 'echo a=~'
a=~
$ zsh -o magic_equal_subst -c 'echo a=~'
a=/home/stephane
$ zsh -o magic_equal_subst -c 'echo --a=~'
--a=/home/stephane

В случае ~ (в отличие от ~user), вы можете просто использовать $HOME:

cmd --whatever="$HOME/whatever"

~ расширяется до значения $HOME. Если $HOME не задано, поведение изменяется между оболочками. Некоторые оболочки запрашивают пользовательскую базу данных. Если вы хотите принять это во внимание, вы могли бы сделать (и это также то, что вам нужно было бы сделать для ~user):

dir=~ # or dir=~user
cmd --whatever="$dir/whatever"

В любом случае, в оболочках, отличных от zsh, помните вам нужно указать переменные разложения!

12
ответ дан 23 May 2018 в 00:52
  • 1
    В справочном руководстве Bash , похоже, говорится, что тильды расширены только при переменных присваиваниях и в начале слова, поэтому расширение его на echo a=~ кажется противоречивым руководству. – ilkkachu 8 March 2017 в 14:21
  • 2
    @ilkkachu, да, руководство неполное. Он также четко не указывает, в каком контексте ~ будет расширен (что подразумевается под словом «)». Для получения более подробной информации см. Ссылку в верхней части ответа. – Stéphane Chazelas 8 March 2017 в 20:25

~ имеет особые правила расширения, которые ваша команда не удовлетворяет. В частности, он расширяется только при некорректном, либо в начале слова (например, python ~/script.py), либо в начале присвоения переменной (например, PYTHONPATH=~/scripts python script.py).

Непосредственное исправление заключается в использовании переменной оболочки $HOME, которая следует за регулярными правилами расширения переменных:

python ptb_word_lm.py --data_path=$HOME/blabla
6
ответ дан 23 May 2018 в 00:52
  • 1
    Это немного упрощено, существуют другие контексты, когда было выполнено расширение тильды , как в PATH=$PATH:~/bin. Кроме того, что $HOME необходимо указывать или разбивать + glob применяется в оболочках, отличных от zsh. – Stéphane Chazelas 7 March 2017 в 14:59
  • 2
    @sch извините, но ссылка, которую вы указали в комментарии, приводит к вопросу о оптической мыши, без упоминания расширения тильды. Не могли бы вы объяснить это? – Sergiy Kolodyazhnyy 8 March 2017 в 10:57
  • 3
    Хороший ответ. Он суммирует в основном то, что bash указывает вручную в разделе Tilde Expansion. +1 – Sergiy Kolodyazhnyy 8 March 2017 в 10:58
  • 4
    Извините, я так привык использовать ссылки внутри сайта в unix.SE, как в [link](/a/146697), что я не понимал, что мы были на другом сайте здесь. Ссылка должна быть в там – Stéphane Chazelas 8 March 2017 в 12:08

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

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