Я использую MacOSX в bash
качестве оболочки. У меня есть символическая ссылка, созданная так:
ln -s /usr/bin/python python2
У меня есть пакет, который использует python2, и я хочу создать символьную ссылку в моем текущем рабочем каталоге, к /usr/bin/python
которому фактически относится python2. Когда я делаю python2
из командной строки, я получаю эту ошибку:
python2: realpath couldn't resolve "/usr/bin/python2"
Но вызов его таким образом ./python2
разрешает путь правильно. Мой PATH
имеет .
в этом. На самом деле я изменил его, для тестирования, чтобы иметь только .
в нем.
Как мне решить это? Благодарность!
контекст
Ряд предложенных ниже решений не подойдет для меня. Я старался изобразить свой вопрос как можно более сфокусированным и кратким, чтобы люди не утонули в море текста, но, очевидно, мне нужно предоставить больше информации.
Я пытаюсь сделать разработку на пакете, который я клонировал из git. Оригинальный пакет git-multimail
, был / был разработан для некоторого варианта Linux (я полагаю, Ubuntu). Я пытался изменить его, чтобы иметь возможность использовать его и его набор тестов на MacOSX с минимальными изменениями, насколько это возможно. Вот почему некоторые из предложенных решений не идеальны:
В качестве пользователя root создайте
python2
символическую ссылку в / usr / bin /. Я ищу решение, которое бы не требовало этого. Вначале это был очевидный вариант, но я бы хотел, чтобы решение, которое как можно меньше модифицировало хост-систему. Вот почему я хотел создать временную символическую ссылку в текущем рабочем каталоге, добавить CWD (т.е..
) к моему пути, а затем уничтожить его, когда закончите (т.е. символическую ссылку).Создайте скрипт-обертку для вызова скрипта python с существующим python. Проблема с этим заключается в том, что большая часть тестового набора использует фактические файлы script_files в качестве исполняемых файлов, в зависимости от shebang, чтобы найти правильную среду выполнения. Это значило бы значительно изменить набор тестов. В этом контексте (фрагмент кода тестовой структуры см. Ниже) мне пришлось бы добавить оболочку для каждого
.py
файла; кроме того, пользователь / разработчик должен знать о различных правилах использования пакета в зависимости от того, в какой системе он работает (т.е. в MacOSX убедитесь, что вы не используете файлы python, не вызывая их через оболочку или явно вызывая/usr/bin/python file.py
).#! /bin/sh D=$(cd $(dirname "$0") && pwd) MULTIMAIL="$D/../git-multimail/git_multimail.py" POST_RECEIVE="$D/../git-multimail/post-receive" TESTREPO=$("$D/create-test-repo") HOME="$D" XDG_CONFIG_HOME="$D" GIT_CONFIG_NOSYSTEM=1 export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM cd $TESTREPO test_email() { REFNAME="$1" OLDREV="$2" NEWREV="$3" echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL" }
Меняются все
python2
ссылки наpython
. README предлагает это, но фактически делает управление версиями бесполезным, поскольку система видит изменение как новую версию, хотя на самом деле это не так (семантически).
Я использовал (3), но я пытаюсь найти лучшее решение. Я согласен с тем, что так обстоят дела (то есть нет подходящего способа указать 'python2' на /usr/bin/python
то, что он переносимый и ненавязчивый, без большого количества изменений в наборе тестов и реальной платформе).
ln -s /usr/bin/python /usr/bin/python2
git-multimail.py
это#!/usr/bin/env python2
так, есть (относительно) простой способ сделать это.ln -s /usr/bin/python2.7 /usr/local/bin/python2
сделалОтветы:
Если вам нужно разрешить (или исследовать) символическую ссылку, вы можете использовать независимую от платформы библиотеку bash 'realpath-lib'. По умолчанию он эмулирует readlink и будет работать на Mac или Unix. Его можно найти на Github или Bitbucket, и это бесплатно.
Но, похоже, вы хотите просто сделать python2 (а не ./python2) из своего локального (рабочего) каталога. Возможно, это можно сделать с помощью псевдонима в вашем .bashrc, иначе вам нужно будет добавить рабочий каталог (содержащий символическую ссылку) в переменную среды PATH. Это также можно сделать только для текущего сеанса или в файле .bashrc для будущих сеансов. Это может быть решением для конкретного пользователя.
Другим вариантом, который будет работать для всех пользователей, будет создание символической ссылки python2 на / usr / bin / python в другом каталоге пути, например, в / usr / local / bin. Возможно что-то вроде:
Тогда любой пользователь или скрипт должен найти команды python или python2. Конечно, эта опция требует прав администратора (root) для установки.
источник
python2
к/usr/bin
(хотя я рассматриваю добавление его как улучшение, если честно).Я полагаю, что вы используете систему Apple для управления несколькими версиями одной и той же программы и переключения между ними. Вы можете выполнить то, что хотите, менее изящно, но без проблем, с помощью следующего сценария с именем
python2
:Сделайте его исполняемым (
chmod +x python2
), и вы в деле.Объяснение проблемы:
При запуске
/usr/bin/python
он находит и выполняетpython2.7
в том же каталоге. Ваша символическая ссылка не работает, потому что система переходит по символической ссылке/usr/bin
, затем ищет и не может найтиpython2
там. Вы можете сделать еще один шаг, используя «жесткую ссылку» вместо символической ссылки:Теперь нет символической ссылки для подражания, только два имени файла для одного и того же файла (inode). Но сейчас я терплю неудачу со следующим сообщением:
Обратите внимание
python22.7
: фреймворк добавляет2.7
к имени, которое вы создали! Вместо того, чтобы пытаться разобраться в этом и создать лес ссылок, который соответствует его ожиданиям, я рекомендую вам не вмешиваться в структуру управления версиями и использовать решение, предложенное выше.PS. Возможно, было бы лучшее решение: если бы вы объяснили, что вам нужно сделать для начала (почему вы должны предоставить
python2
в качестве псевдонимаpython
), кто-то, вероятно, может помочь вам сделать это по-другому. Это известно как «проблема XY» в lingo stackexchange ...источник
/usr/bin/python
, он находит и выполняет python2.7 в том же каталоге. Это очень запутанное утверждение. Если вы описываете случай, когда/usr/bin/python
есть символическая ссылка, пожалуйста, будьте более конкретны.Пытаться:
источник
Вы можете использовать команду Unix
readlink
чтобы узнать физический путь к ссылкам.Примеры
Скажем, у меня есть следующая ссылка:
Чтобы найти значение, на которое указывает символическая ссылка
ПРИМЕЧАНИЕ: приведенный выше результат может быть другой ссылкой. Чтобы решить эту проблему см. № 2 ниже.
Чтобы узнать абсолютный путь к значению, на которое указывает символическая ссылка
источник
Я не понимаю - как вы считаете, что ссылка на оболочку в порядке, но не сценарий оболочки? ? Любой из них является просто уровнем косвенности. И разве вам не придется инструктировать своих пользователей только вызывать его из определенного каталога?
В любом случае, вы можете получить текущий рабочий каталог в
$PATH
:Пожалуйста, получите. из вашего
$PATH
. Это ужасная идея.источник
.
в моем $ PATH плохая идея? Если я поставлю его в конец, то последнее место, которое будет просмотрено, - это мой текущий рабочий каталог (то есть `PATH =" $ {PATH}: $ {PWD} ". Сценарий-обертка означает, что для каждого файла python Мне нужно создать дополнительный файл. Ссылка-обертка на исполняемый файл python просто создает для меня одну вещь--bind mount
исполняемый файл в текущем каталоге или (я думаю, только в linux) дажеchroot
при необходимости. Но . в$PATH
работах для любого каталога и не является конкретным. Это опасно для ваших пользователей. В любом случае я очень четко продемонстрировал, как это сделать выше. Разве это не соответствует вашим требованиям?