Какова цель 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когда хотите, чтобы подпрограммы видели значения, установленные в оболочке, и не используете его, если не хотите, чтобы это произошло.
Как правило, я не экспортирую временные переменные в сценарии оболочки, потому что не хочу, чтобы они меняли поведение программ, запускаемых из этого сценария оболочки.
Я не собираюсь отвечать на любые другие ваши вопросы. Вы должны задавать только один вопрос за раз. Я только ответил на это много, потому что они смутно связаны. Все остальное относится к отдельному вопросу.