Что такое PATH в Mac OS?

12

Что такое 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?

GWG
источник
2
Пожалуйста, не объединяйте несколько вопросов в одном посте. Каждый из ваших вопросов будет приветствоваться здесь отдельно, но не все вместе, как это. Пожалуйста, сократите это до одного вопроса, вы можете объединить 1 и 2, но другие не имеют ничего общего с PATH. 3 здесь ответили 4 объяснено здесь и 5 не имеет особого смысла, я боюсь. Также не ваш бонус вопрос, какие файлы являются двоичными? Скриптов нет.
Terdon
Я отредактировал свой вопрос вниз. Кроме того, я нашел эти ссылки полезными. Спасибо.
GWG

Ответы:

15

1. Какова цель PATH?

PATHэто переменная окружения, которая содержит разделенный двоеточиями список каталогов, в которых ваша оболочка будет искать исполняемые файлы, которые вы называете в командной строке, без указания пути к ним (как в вашем jsdocпримере) Таким образом, если ваш PATHимеет

/usr/bin:/bin:/home/bin

тогда любой исполняемый файл, который вы называете по имени, будет найден в этих каталогах (в указанном порядке), и первый найденный исполняемый файл будет исполнен.

2. В чем разница между / etc / paths и ~ / .bash_profile

Согласно этому вопросу на ServerFault , /etc/pathsиспользуется для PATHглобальной настройки (т. Е. Для всей системы, для всех пользователей), в то время ~/.bash_profileкак для установки пользовательских настроек (где ~будет домашний каталог пользователя). То, что написано, .bash_profileможет либо добавить к глобальному PATHиз, /etc/pathsлибо полностью его переопределить.

Для записи, /etc/pathsкажется, особенность MAC OS: я не сталкивался с этим по крайней мере в GNU / Linux.

Джозеф Р.
источник
Я просто отредактировал их, но спасибо за ответы на все из них!
GWG
@ggundersen Я урезал свой ответ, чтобы соответствовать твоему отредактированному вопросу.
Джозеф Р.
@ggundersen вы также можете прочитать мой ответ и ссылки там о /etc/pathsOSX.
Terdon
7

Какова цель PATH?

Так ваша оболочка находит программы. При вводе ls, например, что работает программа под названием , lsкоторая живет в /binбольшинстве систем, включая Mac OS X. Ваша оболочка может найти только , что из - за /binэто в PATH.

Оболочка ищет программы по PATHпорядку слева направо. Если lsв вашей системе есть две программы, и их каталоги находятся в вашей PATH, она найдет одну в каталоге, указанном первой в вашей PATH.

В чем разница между / etc / paths и ~ / .bash_profile

Установленные пути /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 в качестве оболочки.

В чем разница между PATH и $ PATH и $ {PATH}?

Обычно вы видите переменную без сигил, когда вы ее устанавливаете. FOO=barустанавливает FOOпеременную среды в строку bar. Если вы наберете set, оболочка покажет вам все переменные окружения, и в этом случае вы также увидите переменную без сигил.

$PATHи ${PATH}обычно взаимозаменяемы. Они говорят оболочке расширять значение текущей PATHпеременной на месте. Разница заключается в том, как и где вы их используете. Например:

$ FOO=bar
$ echo $FOO
bar
$ echo $FOOx

$ echo ${FOO}x
barx

Во второй echoкоманде оболочка ничего не печатает, потому что она просит оболочку напечатать переменную с именем FOOx, которая не существует; оболочка обрабатывает несуществующие переменные как пустые. Поскольку третий echoиспользует синтаксис фигурных скобок, он позволяет оболочке видеть, что вы запрашиваете FOOпеременную, и что xэто просто еще один символ, который вы хотите напечатать сразу после этого.

Между прочим, есть другой способ получить тот же эффект без фигурных скобок:

$ echo "$FOO"x
barx

Переменные окружения раскрываются в двойных кавычках, а кавычки отделяются xот раскрытия переменных, поэтому оболочка делает правильные вещи.

Я использую FOOпеременную окружения здесь просто для ясности. Все, что я написал выше, также применимо PATH, поскольку это просто еще одна переменная окружения. Тексты примеров были бы намного длиннее.

Что означает экспорт PATH? Когда мы экспортируем?

В приведенном выше FOOпримере, если вы запустите другую программу, она не увидит FOOпеременную, потому что она не экспортируется. Он живет только в одном экземпляре оболочки:

$ echo $FOO
bar
$ bash
$ echo $FOO

$ exit
$ export FOO
$ bash
$ echo $FOO
bar

Когда я впервые запускаю новую bashоболочку под той, которую я уже использовал, а затем пытаюсь показать значение FOO, я получаю пустое значение, потому что FOOне было экспортировано для просмотра подпрограммами. Затем я вышел из второго bashэкземпляра, экспортировал его, bashснова запустился , и теперь второй экземпляр видит значение FOO.

Вы используете, exportкогда хотите, чтобы подпрограммы видели значения, установленные в оболочке, и не используете его, если не хотите, чтобы это произошло.

Как правило, я не экспортирую временные переменные в сценарии оболочки, потому что не хочу, чтобы они меняли поведение программ, запускаемых из этого сценария оболочки.

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

Уоррен Янг
источник