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