Добавьте каталоги в $ PATH, не повторяя себя

Моя оболочка zsh, а OS - Ubuntu 13.04

Мне нужно добавить каталог в $ PATH, чтобы он работал в следующих местах:

В графической среде (Unity) (например, запущенные приложения, программа gmrun, работающая по ярлыку (это в основном как «команда запуска» на alt + f2). В терминале в Unity In терминал на Ctrl + Alt + F1

Я добавил он в .profile, и он работает для первых двух точек, но не для последнего. Я знаю, что могу добавить его к .zshrc, но в этом случае он будет записан в местах буксировки (нарушает DRY), а в случае терминала внутри единство будет два раза в $PATH (я не думаю, что это очень плохо, но это по крайней мере не очень)

Если я добавлю его только в .zshrc, он работает только для второго и третьего (очевидно)

Что я могу сделать?

1
задан 30 July 2013 в 21:55

2 ответа

Установка переменной окружения для всех пользователей (неважно какого типа)

лучший способ заключается в использовании [Ф4]. Например, чтобы добавить [F5], чтобы в конце ваш [ф6], вы бы положить это в файл [ф7] в вашем домашнем каталоге:

[Ф1]

Установка переменных среды в глобальном масштабе (но не делайте этого, если вам нужно)

если вы хотите что-то добавить к нажать [F8] для всех пользователей, с помощью [F9] и вместо. К сожалению, [ф10] и на [F11] не используйте тот же синтаксис. Пока ни на самом деле сценарий, [ф12] выглядит как сценарий (без каких-либо [от f13] команды). Поэтому, если ты хотел добавить [ф14] до конца все [ф15], а линия [ф16] в [f17 в] началось

[Ф2]

тогда бы вы изменить его на:

[Ф3]

Анализ

большинство Борна-стиль раковин, в том числе [ф18], источник [зг19], когда они начали в качестве регистрационной оболочки. [20 фунтов] представляет собой необычное исключение; он сделает это, если он вызывается с именем одного из традиционных Борна-стиль раковины. То есть, если вы все пользователи [клавиши f21] по имени [ф22] или [ф23] (наиболее часто достигается путем создания символической ссылки в [ф24] с одним из этих имен), он будет вести себя как им и источник [f25 привод датчика] (если это логин оболочки). В противном случае, его не будет. (Источник: [ф6].)

вот почему zsh в виртуальной консоли (например, когда вы идете на Ctrl+АЛТ+Ф1) не установить переменную [ф28] среды ~/.profile. Это оболочка, но [f30 с] - особое, оно не ведет себя как традиционный Борна-стиль раковины, если она притворяется.

почему [ф31] запуск окна терминала есть переменные окружения, установленные в [f32 из]? Потому что они уже были установлены в графический сеанс, прежде чем запустил терминал. Когда вы входите в систему графически отобразить диспетчере (которых обеспечивает графический экран входа в систему и управляет графический сеансов) без. Как правило, это источники ~/.profile (хотя не гарантируется, что он будет делать так, и иногда кто-то меняет окружение рабочего стола, только чтобы найти, что ~/.profile больше не поступает при входе в систему графически).

нет ничего о тексте на основе виртуальных консолей, что делает [ф35] вам не получены. Например, если ваша оболочка были [f36 в] вместо [фунции f37] и вы вошли в виртуальную консоль, ~/.profile будут получены. Вопрос в том, что в отличие от надежного поведения традиционного Борна-стиль оболочки, и не совсем надежным поведения менеджера дисплее, начиная с графического сеанса, [f39 расстройства] не источник [ф40] когда это ваша оболочка.

аналогично, с переменными окружения в [ф41], если вы должны были войти в систему удаленно (например, путем включения SSH и вход в ту сторону), ~/.profile не быть получены.

это относится к глобальному файл /etc/profile тоже, кстати. Если у вас есть набор переменных среды во всем мире, вы будете испытывать такое же поведение вы видите, установка переменных среды пользователя в [пулемет f44].

решение, использовать [Ф4]., является установка пользовательских переменных среды в [f45 С] и системной (т. е. для всех пользователей) переменные среды в /etc/environment.

когда вы сделаете это, виртуальной консоли!д15] (в частности, pam_env.so) задает переменные на входе, практически каждый Тип входа в систему, и делает так они уже были установлены в графический сеанс, прежде чем запустил терминал оболочка (например, zsh, bash для большинства людей) или логин-Шелл-как вещь (например, диспетчера отображения) источники собственных конфигурации входа в систему файлов. Это, как правило, рекомендуется установить переменные окружения в Ubuntu эти дни.

этот способ решает проблему некоторые снаряды логин не всегда источники [ф50] и /etc/profile (это проблема, с которой вы столкнулись). Он также решает иногда проблему диспетчере отображения не рентабельные файл, так как он инициализирует графический сеанса (это проблема, с которой вы не испытываете).

альтернативы

а что если:

вам нужно установить переменные окружения при входе в систему, на основе результатов тестовых скриптов? Или вы просто не хотите использовать .pam_environment (или для всей системы переменных, /etc/environment? [dрайвер d41]если Вы не используете zsh, но [f55, которая] или еще более традиционный Борна-стиль Shell, то вы могли бы просто установить переменные окружения в ~/.profile (или /etc/profile для общесистемных переменных). По повод есть конфигурации, где это не установлено им для графических сеансов входа в систему, но обычно это работает.[!dрайвер d41]

их ~/.bashrc не. По сути, только bash источники этого файла, поэтому он будет работать ни когда [от f60] ваша оболочка, ни когда диспетчер дисплей выступает в качестве оболочки входа в систему. (Другими словами, в вашей ситуации, что никогда не будет работать на всех.)

таким образом, если вам нужен скрипт, который поступает по всем видам логин, и [ф61], источником для ваших графических сессий, можно просто:

вам нужно установить переменные окружения при входе в систему, на основе результатов тестовых скриптов? Или оба [64-го фокуса]'конфигурации S и [f65 в] источник третий, общий файл. (Это может даже быть добавлены в отдельный конфигурационный файл для графики сессий, таких как .xsession, если это оказалось необходимо позже.)

из этих двух вариантов второй лучше, если ты просмотрел содержимое ~/.профильand made sure they--and the contents of any script sourced from.профиль[f68 не]ЗШ`. (Это, как правило, не должны, но вы никогда не знаете.)

лучшие конфигурационный файл для изменения, чтобы сделать zsh источник [р70] (или другой скрипт) на логин, это ~/.zprofile. Это соответствует ~/.profile на более традиционные Борна-стиль раковины. (Строго говоря, это $ZDOTDIR/.zprofile, но $ZDOTDIR обычно [f75 в Джей].)

нужно добавить строку source $HOME/.profile к этому файлу.

я подчеркиваю, однако, что если просто нужно выполнять простые задание переменных среды (в том числе рекурсивное задание, где переменные среды присваивается выражение, содержащее себя и/или других переменных окружения), вы должны просто использовать [f77 на английском языке] как описано выше (или /etc/environment на системную "переменные среды").

4
ответ дан 24 May 2018 в 19:31
  • 1
    Я пробовал с .pam_environment. Он работает на терминале в Unity, но не в виртуальном сеансе консоли (путь просто не добавлен) – RiaD 30 July 2013 в 22:23
  • 2
    @RiaD Что делает? Вы говорите, что .pam_environment не влияет на переменные среды на виртуальной консоли? Вы начинаете новый сеанс виртуальной консоли (т. Е. Выходите и возвращаетесь)? Если это так, то наиболее вероятным объяснением является то, что переменные установлены в из .pam_environment, но тогда один из ваших конфигурационных файлов zsh заменяет PATH своим PATH, trashing их. Решение состоит в том, чтобы сделать любую настройку PATH в файлах конфигурации zsh рекурсивными. Если вы не уверены, что это происходит, отправьте сообщения .zshenv, .zprofile, .zlogin и .zshrc. – Eliah Kagan 30 July 2013 в 22:26
  • 3
    @RiaD Извините, я не понимаю, что вы имеете в виду. – Eliah Kagan 30 July 2013 в 22:30
  • 4
    Они не установлены (после перезагрузки). Речь идет не о $PATH только PAPERSIZE=a4 в этом файле, а echo $PATH печатает a4 в единстве termonal, но ничего в tty – RiaD 30 July 2013 в 22:32
  • 5
    Что вы имеете в виду, когда говорите «Это не о $PATH»? Что PAPERSIZE имеет к этому отношение? Вы можете установить эту переменную в .pam_environment, но как ваш вопрос (этот), так и сообщение, которое я связал с .pam_environment, примерно PATH и не около PAPERSIZE. Вы говорите, что установка PAPERSIZE=a4 заставляет PATH содержать a4? Какую переменную или переменные вы задаете и как? Каково содержимое вашего .pam_environment файла? Каковы содержимое четырех файлов конфигурации zsh, о которых я упоминал? – Eliah Kagan 30 July 2013 в 22:35

Прежде всего, вы можете просто указать свой .profile в вашем файле .zshrc.

Кроме того, поскольку вы используете zsh, вы можете добавить следующее к своему .zshrc: [!d1 ]

typeset -U path

# If you want it at the front of your path
path=({/custom/path/bin "${path[@]}")

# If you want it at the end of your path
path+=(/custom/path/bin)

Как это работает:

В zsh переменная $PATH привязана к переменной $path; $path - массив, а $PATH - скаляр с элементами $path, соединенными : (идентичными ${(j|:|)path}). typeset -U path делает элементы массива path уникальными.

   typeset [ {+|-}AEFHUafghklprtuxmz ] [ -LRZi [ n ]] [ name[=value] ... ]
   typeset -T [ {+|-}Urux ] [ -LRZ [ n ]] SCALAR[=value] array [ sep ]
          Set or display attributes and values for shell parameters.
          (...)
          -U     For  arrays  (but  not for associative arrays), keep only
                 the first occurrence of each duplicated value.  This  may
                 also  be  set for colon-separated special parameters like
                 PATH or FIGNORE, etc.  This flag has a different  meaning
                 when used with -f; see below.
1
ответ дан 24 May 2018 в 19:31

Другие вопросы по тегам:

Похожие вопросы: