Что такое PATH
в Mac OS? Я использовал его для установки глобальных инструментов командной строки, но единственная документация, которую я нашел, - это учебные пособия для этого, без реального объяснения того, что происходит под капотом. Я также не нашел соответствующей страницы в Википедии .
Так какова цель PATH
и в чем разница между /etc/paths
и ~/.bash_profile
**?
Например, в моем paths
файле я вижу это:
/usr/bin
/bin
/usr/sbin
/sbin
/usr/local/bin
Но по моему ~/.bash_profile
, я вижу это:
# Setting PATH for Python 2.7
# The orginal version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH
Это просто пользовательское дополнение к paths
файлу? Что это за штука paths
, как /usr/bin
?
Ответы:
1. Какова цель PATH?
PATH
это переменная окружения, которая содержит разделенный двоеточиями список каталогов, в которых ваша оболочка будет искать исполняемые файлы, которые вы называете в командной строке, без указания пути к ним (как в вашемjsdoc
примере) Таким образом, если вашPATH
имееттогда любой исполняемый файл, который вы называете по имени, будет найден в этих каталогах (в указанном порядке), и первый найденный исполняемый файл будет исполнен.
2. В чем разница между / etc / paths и ~ / .bash_profile
Согласно этому вопросу на ServerFault ,
/etc/paths
используется дляPATH
глобальной настройки (т. Е. Для всей системы, для всех пользователей), в то время~/.bash_profile
как для установки пользовательских настроек (где~
будет домашний каталог пользователя). То, что написано,.bash_profile
может либо добавить к глобальномуPATH
из,/etc/paths
либо полностью его переопределить.Для записи,
/etc/paths
кажется, особенность MAC OS: я не сталкивался с этим по крайней мере в GNU / Linux.источник
/etc/paths
OSX.Так ваша оболочка находит программы. При вводе
ls
, например, что работает программа под названием ,ls
которая живет в/bin
большинстве систем, включая Mac OS X. Ваша оболочка может найти только , что из - за/bin
это вPATH
.Оболочка ищет программы по
PATH
порядку слева направо. Еслиls
в вашей системе есть две программы, и их каталоги находятся в вашейPATH
, она найдет одну в каталоге, указанном первой в вашейPATH
.Установленные пути
/etc/paths
добавляются кPATH
при запуске во всех оболочках Mac OS X.~/.bash_profile
это всего лишь один из нескольких сценариев оболочки, запускаемых Bash при запуске, и некоторые из них относятся к Bash. Поэтому, если вы измените свою оболочку - Mac OS X также поставляетсяtcsh
иzsh
, например, - изменения, внесенные, чтобы/etc/bashrc
не применяться к вашей новой оболочке.Кроме того,
/etc/paths
это файл конфигурации на уровне системы, в то время~/.bash_profile
как для каждого пользователя. Если на вашем Mac было настроено несколько интерактивных пользователей, вы бы не хотели добавлять каталоги,/etc/paths
которые вы не хотели бы видеть у всехPATH
. То же самое верно, за/etc/bashrc
исключением того, что, конечно, это относится только к пользователям, которые используют Bash в качестве оболочки.Обычно вы видите переменную без сигил, когда вы ее устанавливаете.
FOO=bar
устанавливаетFOO
переменную среды в строкуbar
. Если вы наберетеset
, оболочка покажет вам все переменные окружения, и в этом случае вы также увидите переменную без сигил.$PATH
и${PATH}
обычно взаимозаменяемы. Они говорят оболочке расширять значение текущейPATH
переменной на месте. Разница заключается в том, как и где вы их используете. Например:Во второй
echo
команде оболочка ничего не печатает, потому что она просит оболочку напечатать переменную с именемFOOx
, которая не существует; оболочка обрабатывает несуществующие переменные как пустые. Поскольку третийecho
использует синтаксис фигурных скобок, он позволяет оболочке видеть, что вы запрашиваетеFOO
переменную, и чтоx
это просто еще один символ, который вы хотите напечатать сразу после этого.Между прочим, есть другой способ получить тот же эффект без фигурных скобок:
Переменные окружения раскрываются в двойных кавычках, а кавычки отделяются
x
от раскрытия переменных, поэтому оболочка делает правильные вещи.Я использую
FOO
переменную окружения здесь просто для ясности. Все, что я написал выше, также применимоPATH
, поскольку это просто еще одна переменная окружения. Тексты примеров были бы намного длиннее.В приведенном выше
FOO
примере, если вы запустите другую программу, она не увидитFOO
переменную, потому что она не экспортируется. Он живет только в одном экземпляре оболочки:Когда я впервые запускаю новую
bash
оболочку под той, которую я уже использовал, а затем пытаюсь показать значениеFOO
, я получаю пустое значение, потому чтоFOO
не было экспортировано для просмотра подпрограммами. Затем я вышел из второгоbash
экземпляра, экспортировал его,bash
снова запустился , и теперь второй экземпляр видит значениеFOO
.Вы используете,
export
когда хотите, чтобы подпрограммы видели значения, установленные в оболочке, и не используете его, если не хотите, чтобы это произошло.Как правило, я не экспортирую временные переменные в сценарии оболочки, потому что не хочу, чтобы они меняли поведение программ, запускаемых из этого сценария оболочки.
Я не собираюсь отвечать на любые другие ваши вопросы. Вы должны задавать только один вопрос за раз. Я только ответил на это много, потому что они смутно связаны. Все остальное относится к отдельному вопросу.
источник