Passei muito tempo lendo sobre login e shells interativos e por que se deve ou não definir o ambiente variáveis, funções de shell, etc. nos vários perfis e arquivos bashrc. neste post foi mencionado que coisas específicas do bash, como opções de prompt, devem ser definidas em ~ / .bashrc. Isso me levou a questionar sobre a variável PS1. Em todos os exemplos que vi em relação a isso, eles têm algo como export PS1="". Isso realmente deveria ser exportado para o ambiente, já que só tem significado para bash? Basta ter PS1="" em meu ~ / .bashrc produz o efeito pretendido para mim, mas estou me perguntando se estou perdendo alguma coisa.

Resposta

Correto: PS1 só é significativo em instâncias interativas de bash, por isso deve ser definido em ~/.bashrc e não deve ser exportado. PS1 também é significativo em outros shells, mas tem um significado diferente, porque as expansões imediatas diferem entre os shells. Na verdade, mesmo entre instâncias de bash, PS1 pode ter significados diferentes, uma vez que o significado depende das opções do shell (pelo menos promptvars).

Exportar PS1 para o ambiente de .profile é um retrocesso aos anos 1970, quando havia apenas um shell que o usava (o shell Bourne) e não tinha um arquivo de configuração. Ainda funciona hoje se você sempre usar o mesmo shell e nunca configurá-lo de maneira diferente. Mas todos os shells modernos que não são projetados exclusivamente para scripts (csh, ksh , bash, zsh,…) lêem um arquivo de configuração quando iniciado interativamente (.cshrc, .kshrc, .bashrc, .zshrc,…), então o método dos anos 1970 não é mais necessário. Definir PS1 e outras configurações específicas do shell em um arquivo específico do shell, e não exportá-lo para o ambiente, evita quebrar coisas quando você usa uma configuração de shell diferente ou um shell diferente ou um terminal diferente que não é capaz de mostrar sua fantasia usual de prompt. A configuração de PS1 em um arquivo específico de shell funciona o tempo todo, enquanto a configuração em .profile e exportá-lo só funciona em casos “simples”, então não há razão para não fazer isso da maneira certa, mas existem muitos tutoriais ruins pela web e até mesmo configurações padrão ruins nas distribuições. C “est la vie .

Comentários

  • Como exportar PS1 de .profile funcionam para shells bash sem login, uma vez que não ' os forneceriam? Você está dizendo que isso funcionaria porque o o shell de login seria bifurcado de um shell de login, então herdaria PS1 por meio do ambiente?
  • @MikeSweeney sim, esse ' s por que ' s exportado .
  • Uma maneira de espalhar a ideia errada sobre a exportação de PS1 é ver if [ -n "$PS1" ] ; then proceed assuming an INTERACTIVE shell ; fi – que normalmente aparece em pessoas ' s arquivos .bashrc para carregar apenas coisas como conclusão de comando se este for um usuário ' s shell de terminal interativo. Então, vendo-o funcionar lá, a mesma lógica acaba nos scripts de shell, portanto, a " precisa " para exportá-lo. EM VEZ, devemos verificar usuários terativos / terminais com tty -s ou test -t 0.
  • @DouglasDD De fato. O PS1 teste foi realizado no Debian ' s /etc/profile por idades, por exemplo. Não ' não sei de onde surgiu essa prática inadequada. Suspeito que veio de um caso de uso específico (talvez detectando logins rlogin ou ssh?) Onde funcionou. Infelizmente, ele falha em muitos outros casos, daí as muitas perguntas sobre este tópico aqui e em outros lugares.
  • @Gilles não devemos exportar CLICOLOR e LS_COLORS também? @DouglasDD isso significa que a if [[-z $p1]];then return fi verificação em meu .bashrc é falha?

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *