Должен ли менеджер пакетов изменить ваш файл .bashrc?

9

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

Дэвид Кауден
источник
7
Можете ли вы заставить что-то вести себя лучше, удалив зависимость от переменной среды (например, используя вместо этого файл конфигурации)? .bashrcЯ думаю, что это было бы предпочтительнее, чем хакерство или хакерство .
Конечно, но давайте скажем для целей этого вопроса, что изменение приложения не вариант.
Дэвид Коуден
1
Что делать, если пользователь не работает bash? Есть много альтернативных оболочек, доступных с большим количеством файлов запуска. Я серьезно предлагаю найти здесь альтернативное решение.
Жюль
10
Так что напишите обертку вокруг него. Посмотрите, например, tomcatчто для правильной работы требуется несколько переменных среды; они все устанавливаются сценарием запуска, который запускается вместо запуска его двоичного файла напрямую.
Жюль
1
@Vality я знаю. Предложение Жюля уже было предложено. Я шучу - высмеиваю круговую логику, связанную с тем, чтобы сначала утверждать, что у меня должно быть независимое от оболочки решение, а затем перейти к предложению использовать сценарий оболочки в качестве решения. Это шутка (;
Дэвид Коуден

Ответы:

18

Должен ли шаг установки диспетчера пакетов изменить среду пользователя или просто предложить пользователю сделать это самостоятельно?

Ни. Установщики пакетов никогда не должны трогать что-либо в домашнем каталоге для учетной записи, которой пакет не принадлежит. Пакеты также должны настраиваться так, чтобы, если они установлены, их можно было использовать без особых усилий со стороны пользователя. (Есть исключительные случаи, когда вы не хотите этого делать, но их мало и далеко.)

В средах Unixy есть место для размещения файлов конфигурации, которые читаются всякий раз, когда пользователь запускает оболочку входа в систему. Для оболочек Bourne и C вы можете вставить свою конфигурацию в /etc/profileи /etc/csh.cshrcсоответственно. (Не забудьте удалить его при удалении.)

Многие системы также поддерживают это, используя отдельные файлы, что упрощает добавление и удаление фрагментов конфигурации без необходимости помещать текст в произвольное место в одном файле. (Он также дает вам все преимущества управления и подотчетности, которые вы получаете от менеджера пакетов.) Некоторые дистрибутивы будут настраивать /etc/profileчтение всех файлов в соответствии /etc/profile.d/*.sh.

Blrfl
источник
1
Исторически сложилось так, rcчто имя сценария происходит от CTSSruncom (команды запуска), но с тех пор расширило сферу действия, включив в него другие значения.
Джеффри Хантин
1
@JeffreyHantin: Touché. Удалены.
Blrfl
1
Ненавижу собирать, но profile.dне встроен в bash, обычно это крюк (обычно основа дистрибутива) /etc/profile. ;)
Джеффри Хантин
1
@JeffreyHantin: Достаточно верно, хотя я не буду критиковать использование слова «Unixy». :-)
Blrfl
14

Ни разу не приемлемо , чтобы изменить пользователь /homeструктуру из менеджера пакетов , если что модификация не все точки.

Основными подходами к этому являются:

  • Сообщите пользователю, что он должен настроить его.
  • Поставка по умолчанию, поэтому он не нужен
  • Упакуйте скрипт запуска, который устанавливает значения соответствующим образом
  • (Если это поддерживает дистрибутив) Удалите файл, экспортирующий переменную среды внутри /etc/profile.d. В некоторых системах Linux все сценарии в этом каталоге поставляются с установкой оболочки по умолчанию, поэтому вы можете смело устанавливать переменную там.
Daenyth
источник
7

Вопрос Должен ли шаг установки менеджера пакетов изменять среду пользователя?

Ответ Нет. Плохо изменять данные пользователя, в данном случае файл .bashrc. Данные пользователя должны считаться священными менеджером пакетов?

Вопрос Должен ли этап установки диспетчера пакетов просто предложить пользователю сделать это самостоятельно?

Ответ. Это гораздо более приемлемое решение, но все же не идеальное.

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

Р Саху
источник
Я тоже обдумал эту идею. Проект молодой и достигнет той точки, когда в этом не будет необходимости.
Дэвид Коуден
@ GlenH7 Я обновил свой ответ. Надеюсь, что обновленный ответ - это больше ответа, который вы ищете.
Р Саху
@ GlenH7: Этот вопрос, по сути, является проблемой XY: meta.stackexchange.com/questions/66377/what-is-the-xy-problem , где потребность в переменных среды является истинной проблемой, которую необходимо решить.
whatsisname
Кроме того, предложение этого ответа о создании сценария-оболочки является единственным ответом, который будет работать для всех оболочек.
whatsisname
1
@MattThomason, что осознание того, что побудило меня на самом деле задать вопрос (;
Дэвид Кауден
5

Ты скучаешь по лесу за деревьями. Очевидно, что удобнее выполнять изменения среды для пользователя, но это также более рискованно и несколько агрессивно. Вы должны объединить лучшее из обоих миров, спросив пользователя, должен ли установщик изменить их .bashrc, и в противном случае дать инструкции, как они должны это сделать сами.

Килиан Фот
источник
Спасибо за совет. Я никогда не писал общедоступный пакет раньше и просто хочу убедиться, что я не делаю что-то табу.
Дэвид Коуден
Вот как Google Cloud SDK справляется с этим сегодня. Он спрашивает, хотите ли вы изменить файлы запуска.
JMQ
1

Вы предполагаете, что «пользователь» является единственным. Что произойдет, если в этой системе будут тысячи пользователей?

Вы предполагаете, что можете даже найти домашний каталог пользователя. Если управление пользователями осуществляется, например, с помощью LDAP, вам может быть даже не разрешено получать список всех действительных пользователей. Домашние каталоги не могут быть в / home; они могут быть динамически смонтированы из сети. Домашний каталог пользователя может быть зашифрован, а ключ недоступен, пока он не вошел в систему.

Нет способа сделать это надежно в любой возможной ситуации. Используйте механизм дистрибутива для установки переменных среды для пользователей, когда они входят в систему или порождают оболочки. Если это не сработает, напишите обертку. (Оболочка также может быть бинарной, если необходимо, для адресации аргумента в комментариях).

pjc50
источник
0

Установка глобальной переменной в пакете допустима, если она определена вашим собственным проектом (и это означает, что имя проекта является частью имени переменной!). Даже тогда вы не должны трогать .bashrcфайл пользователя - вместо этого вы должны добавить скрипт в /etc/profile.d .

Идан Арье
источник