Um gerenciador de pacotes deve modificar seu arquivo .bashrc?


9

Estou escrevendo um pacote para algo que requer que uma variável de ambiente seja definida para que seja executada corretamente. A etapa de instalação de um gerenciador de pacotes modifica o ambiente de um usuário ou simplesmente solicita que o usuário faça isso sozinho? Minha intuição seria a segunda, mas posso ver argumentos para a primeira.


7
Você pode fazer com que algo se comporte melhor, removendo a dependência da variável de ambiente (por exemplo, usando um arquivo de configuração)? Seria preferível empacotar hacks ou mexer com .bashrc, eu acho.

Claro, mas vamos dizer, para o propósito desta pergunta, que modificar o aplicativo não é uma opção.
David Cowden

11
E se o usuário não estiver executando bash? Existem muitos shells alternativos disponíveis com uma grande variedade de arquivos de inicialização. Eu sugiro seriamente encontrar alguma solução alternativa aqui.
Jules

10
Então escreva um invólucro em volta dele. Veja, por exemplo, tomcatque precisa de várias variáveis ​​de ambiente para funcionar corretamente; todos eles são definidos por um script de inicialização que é executado em vez de executar seu binário diretamente.
Jules

11
@ Qualidade eu sei. A proposta de Jules já foi sugerida. Estou sendo ridículo - tirando sarro da lógica circular envolvida para argumentar primeiro que eu deveria ter uma solução independente de shell e depois sugerir que eu use um script de shell como solução. É uma piada (;
David Cowden

Respostas:


18

A etapa de instalação de um gerenciador de pacotes modifica o ambiente de um usuário ou simplesmente solicita que o usuário faça isso sozinho?

Nem. Os instaladores de pacotes nunca devem tocar em nada em um diretório inicial para uma conta que o pacote não possui. Os pacotes também devem se configurar para que, se estiverem instalados, sejam utilizáveis ​​sem nenhum esforço especial por parte do usuário. (Existem casos excepcionais em que você não deseja fazer isso, mas são poucos e distantes entre si.)

Os ambientes Unixy têm um lugar para colocar arquivos de configuração que são lidos sempre que um usuário inicia um shell de login. Para os shells Bourne e C, você pode inserir sua configuração em /etc/profilee /etc/csh.cshrcrespectivamente. (Não se esqueça de removê-lo quando você desinstalar.)

Muitos sistemas também suportam isso usando arquivos individuais, o que facilita a adição e remoção de bits de configuração sem a necessidade de colocar texto em algum local arbitrário em um arquivo. (Ele também oferece todos os benefícios de controle e responsabilidade que você obtém de um gerenciador de pacotes.) Algumas distribuições configuram a /etc/profileleitura de todos os arquivos correspondentes /etc/profile.d/*.sh.


11
Historicamente, rcem um script, o nome deriva do CTSSruncom (Run Commands), mas desde então ampliou seu escopo para incluir outros significados.
Jeffrey Hantin

11
@JeffreyHantin: Touché. Removido.
Blrfl

11
Odeio continuar escolhendo, mas profile.dnão está embutido no bash, é um gancho comumente fornecido (geralmente a base da distribuição) /etc/profile. ;)
Jeffrey Hantin

11
@ JeffreyHantin: É verdade, embora não haja críticas ao meu uso da palavra "Unixy". :-)
Blrfl

14

Nunca é aceitável modificar a /homeestrutura de um usuário a partir do gerenciador de pacotes, a menos que essa modificação seja o ponto inteiro.

As principais abordagens para isso são:

  • Notifique o usuário que ele precisa para configurá-lo.
  • Padrões de fornecimento, para que não seja necessário
  • Empacote um script do iniciador que defina os valores adequadamente
  • (Se a distribuição o suportar) Solte um arquivo exportando a variável de ambiente para dentro /etc/profile.d. Em alguns sistemas linux, todos os scripts neste diretório são originados pela configuração padrão do shell, para que você possa definir com segurança a variável.

7

Pergunta A etapa de instalação de um gerenciador de pacotes modifica o ambiente de um usuário?

Resposta Não. É uma má idéia modificar os dados de um usuário, neste caso o arquivo .bashrc. Os dados do usuário devem ser considerados sagrados por um gerenciador de pacotes?

Pergunta A etapa de instalação de um gerenciador de pacotes simplesmente solicita que o usuário faça isso sozinho?

Resposta Esta é uma solução muito mais agradável, mas ainda não é o ideal.

Eu acho que você deve criar um script de shell wrapper onde você pode definir as variáveis ​​de ambiente necessárias e executar o executável depois disso.


Eu considerei essa idéia também. O projeto é jovem e chegará ao ponto em que isso não será necessário.
David Cowden

@ GlenH7 Atualizei minha resposta. Espero que a resposta atualizada seja mais uma resposta que você está procurando.
R Sahu 27/05

@ GlenH7: Esta questão é essencialmente um problema XY: meta.stackexchange.com/questions/66377/what-is-the-xy-problem , onde a necessidade de variáveis ​​de ambiente é o verdadeiro problema a ser resolvido.
whatsisname 27/05

Além disso, a sugestão desta resposta para criar um script de wrapper é a única resposta que funcionará para todos os shells.
Whatsisname 27/05

11
@ MattThomason essa percepção foi o que me levou a realmente fazer a pergunta (;
David Cowden

5

Você está sentindo falta da floresta para as árvores. Obviamente, é mais conveniente executar a alteração do ambiente para o usuário, mas também é mais arriscado e um pouco invasivo. Você deve combinar o melhor dos dois mundos, perguntando ao usuário se o instalador deve modificá-lo .bashrce, caso contrário, forneça instruções sobre como eles devem fazê-lo.


Obrigado pelo conselho. Eu nunca escrevi um pacote público antes e só quero ter certeza de que não faço algo tabu.
David Cowden

É assim que o SDK do Google Cloud lida com isso hoje. Ele pergunta se você deseja modificar seus arquivos de inicialização.
Jmq 27/05

1

Você está assumindo que "usuário" é singular. O que acontece se eu tiver milhares de usuários neste sistema?

Você está supondo que pode encontrar o diretório inicial do usuário. Se os usuários são gerenciados através, por exemplo, do LDAP, você pode nem ter permissão para obter uma lista de todos os usuários válidos. Os diretórios pessoais podem não estar em / home; eles podem ser montados dinamicamente a partir da rede. O diretório inicial do usuário pode estar criptografado e a chave inacessível enquanto não estiver logado.

Não há como fazer isso de maneira confiável em todas as situações possíveis. Use o mecanismo da distribuição para definir variáveis ​​de ambiente para os usuários quando eles se conectam ou geram shells. Se isso não funcionar, escreva um invólucro. (O wrapper também pode ser um binário, se necessário, para abordar o argumento nos comentários).


0

Definir uma variável global em um pacote é aceitável se for definido pelo seu próprio projeto (e isso significa que o nome do projeto faz parte do nome da variável!). Mesmo assim, você não deve tocar no .bashrcarquivo do usuário ; em vez disso, deve adicionar um script ao /etc/profile.d .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.