Compreendendo a configuração do Bash Shell na inicialização

Compreendendo a configuração do Bash Shell na inicialização

Durante anos, o Bash Shell [1] tem sido parte integrante de muitas distribuições Linux. No começo, Bash foi escolhido como a concha oficial da GNU porque era bem conhecida, bastante estável e ofereceu um conjunto decente de recursos.

Hoje a situação é um pouco diferente - o Bash ainda está presente em todos os lugares como um pacote de software, mas foi substituído por alternativas na instalação padrão. Isso inclui, por exemplo, o Debian Almquist Shell (DASH) [2] (para Debian GNU/Linux) ou Zsh [3] (para Grml [5]). Nas distribuições conhecidas Ubuntu, Fedora, Arch Linux e Linux Mint, Bash até agora permaneceu o shell padrão.

É bastante útil entender a startup de bash e saber como configurar isso corretamente. Isso inclui a personalização do seu ambiente de shell, por exemplo, definindo a variável $ PATH, ajustando a aparência do prompt do shell e criando aliases. Além disso, vamos dar uma olhada nos dois arquivos .Bashrc e .Bash_profile que são lidos na startup. O conhecimento correspondente é testado no exame 1 da certificação do Instituto Profissional Linux [4].

Comparando um login interativo e shell não interativo em lote

Em geral, uma concha tem dois modos de operação. Ele pode ser executado como um shell de login interativo e como um shell não interativo em lote. O modo de operação define a inicialização do BASH e quais arquivos de configuração são lidos [7]. O modo de operação pode ser diferenciado da seguinte maneira [6]-Shell de login interativo, shell interativo que não é casca de login, shell de login não interativo e shell não interativo (em lote).

Para simplificar, um shell interativo lê e grava no terminal de um usuário. Por outro lado, uma concha não interativa não está associada a um terminal, como ao executar um script de shell em lote. Uma concha interativa pode ser login ou uma concha não de login.

Shell de login interativo

Este modo refere -se ao login no seu computador em uma máquina local usando um terminal que varia de TTY1 a TTY4 (depende da sua instalação - pode haver mais ou menos terminais). Além disso, este modo cobre remotamente o registro em um computador, por exemplo, através de um shell seguro (SSH) da seguinte maneira:

$ ssh usuário@remoto-sistema
$ ssh user@comando remoto de sistema remoto

O primeiro comando se conecta ao sistema remoto e abre apenas um shell interativo. Por outro lado, o segundo comando se conecta ao sistema remoto, executa o comando fornecido em um shell de login não interativo e encerra a conexão SSH. O exemplo abaixo mostra isso com mais detalhes:

$ ssh localhost uptime
Usuário@senha do localhost:
11:58:49 Up 23 dias, 11:41, 6 usuários, Carregar Média: 0,10, 0,14, 0,20
$

Para descobrir se você está conectado ao seu computador usando um shell de login, digite o seguinte comando echo em seu terminal:

$ echo $ 0
-Bash
$

Para um shell de login, a saída começa com um "-" seguido pelo nome do shell, o que resulta em "-bash" no nosso caso. Para uma concha não de login, a saída é apenas o nome do shell. O exemplo abaixo mostra isso para os dois comandos echo $ 0, e o tempo de atividade é dado ao SSH como um parâmetro de string:

$ ssh localhost "eco $ 0; tempo de atividade"
Usuário@senha do localhost:
Bash
11:58:49 Up 23 dias, 11:41, 6 usuários, Carregar Média: 0,10, 0,14, 0,20
$

Como alternativa, use o comando shopt embutido [8] da seguinte maneira:

$ shopt login_shell
login_shell desligado
$

Para um shell não login, o comando retorna "Off" e para um shell de login, "ON".

Em relação à configuração para esse tipo de shell, três arquivos são levados em consideração. Estes são/etc/perfil, ~/.perfil e ~///.Bash_profile. Veja abaixo uma descrição detalhada desses arquivos.

Concha interativa não logina

Este modo descreve a abertura de um novo terminal, por exemplo, terminal Xterm ou Gnome e execução de uma concha nele. Neste modo, os dois arquivos/etc/Bashrc e ~//.Bashrc são lidos. Veja abaixo uma descrição detalhada desses arquivos.

Concha não interativa não-logina

Este modo está em uso ao executar um script de shell. O script de shell é executado em sua própria subshell. É classificado como não interativo, a menos que solicite a entrada do usuário. O shell se abre apenas para executar o script e fechar -o imediatamente quando o script terminou.

./Local-Script.sh

Shell de login não interativo

Este modo cobre o login em um computador de um controle remoto, por exemplo, via Shell Secure (SSH). O script shell-script local.SH é executado localmente, primeiro, e sua saída é usada como entrada de ssh.

./Local-Script.sh | usuário ssh@sistema remoto

Iniciar SSH sem qualquer comando adicional inicia um shell de login no sistema remoto. Caso o dispositivo de entrada (stdin) do SSH não seja terminal, o SSH inicia um shell não interativo e interpreta a saída do script como comandos a serem executados no sistema remoto. O exemplo abaixo executa o comando de tempo de atividade no sistema remoto:

$ echo "uptime" | ssh localhost
Pseudo-terminal não será alocado porque o stdin não é um terminal.
Frank@Localhost da senha:
Os programas incluídos no sistema Debian GNU/Linux são software livre;
Os termos de distribuição exatos para cada programa são descritos no
arquivos individuais em/usr/share/doc/*/direitos autorais.
Debian GNU/Linux vem com absolutamente nenhuma garantia, na medida em que
permitido pela lei aplicável.
Você tem um novo e -mail.
11:58:49 Up 23 dias, 11:41, 6 usuários, Carregar Média: 0,10, 0,14, 0,20
$

É interessante. Para reduzir a saída do terminal, adicione a opção "SH" como um parâmetro do comando ssh, como mostrado abaixo. O resultado é que um shell é aberto primeiro e os dois comandos são executados sem exibir o MOTD, primeiro.

$ echo "uptime" | ssh localhost sh
Frank@Localhost da senha:
12:03:39 Up 23 dias, 11:46, 6 usuários, Carregar Média: 0,07, 0,09, 0,16
$$

Em seguida, daremos uma olhada nos diferentes arquivos de configuração do Bash.

Bash Startup Arquivos

Os diferentes modos Bash definem quais arquivos de configuração são lidos na inicialização:

  • Shell de login interativo
    • /etc/perfil: se existir, executa os comandos listados no arquivo.
    • ~/.Bash_profile, ~//.Bash_login e ~//.perfil (nessa ordem). Ele executa os comandos do primeiro arquivo legível encontrado na lista. Cada usuário individual pode ter seu próprio conjunto desses arquivos.
  • concha interativa não logina
    • /etc/bash.BASHRC: Configuração do Bash Global. Ele executa os comandos se esse arquivo existir e é legível. Disponível apenas em Debian GNU/Linux, Ubuntu e Arch Linux.
    • ~/.BASHRC: Configuração local do Bash. Ele executa os comandos se esse arquivo existir e é legível.

Pode ser útil ver isso como um gráfico. Durante a pesquisa, encontramos a imagem abaixo, que gostamos muito [9].


imagem: Config-Path.png
texto: Processo de avaliação para configuração de bash

Os diferentes arquivos de configuração explicados

Para os arquivos explicados abaixo, não há conjunto de regras gerais sobre qual opção de armazenar em qual arquivo (exceto as opções globais vs. opções locais). Além disso, o pedido que os arquivos de configuração são lidos é projetado com flexibilidade em mente, para que uma mudança do shell que você usa garante que você ainda possa usar seu sistema Linux. É por isso que vários arquivos estão em uso que configuram a mesma coisa.

/etc/perfil

Este arquivo é usado pelo Bourne Shell (SH), bem como por conchas compatíveis com Bourne como Bash, Ash e Ksh. Ele contém as entradas padrão para as variáveis ​​de ambiente para todos os usuários que login interativamente. Por exemplo, isso influencia o $ PATH e o design imediato para usuários regulares, bem como o usuário chamado "root". O exemplo abaixo mostra uma parte de/etc/perfil de Debian Gnu/Linux.

setUserPath ()
# Diretórios comuns para executáveis ​​para todos os usuários
Caminho = "/usr/local/bin:/usr/bin:/bin"
# Teste para o usuário root adicionar para programas de administração do sistema
se ["'id -u'" -eq 0]; então
Path = "/usr/local/sbin:/usr/sbin:/sbin: $ path"
outro
Path = "/usr/local/jogos:/usr/jogos: $ path"
fi
Caminho de exportação

setUserPath ()
# Ps1 é a string de prompt de comando principal
se ["$ ps1"]; então
Se ["$ Bash"] && ["$ Bash" != "/bin/sh"]; então
# The Arquive Bash.Bashrc já define o PS1 padrão.
# Ps1 = "\ h: \ w \ $"
Se [-f /etc /bash.Bashrc]; então
. /etc/bash.Bashrc
fi
outro
se ["'id -u'" -eq 0]; então
Ps1 = '#'
outro
Ps1 = '$'
fi
fi
fi

Outros arquivos de configuração podem ser salvos no diretório /etc /perfil.d. Eles são adquiridos na configuração do BASH assim que /etc /perfil é lido.

~/.Bash_profile

Este arquivo de configuração local é lido e executado quando o bash é invocado como um shell de login interativo. Ele contém comandos que devem ser executados apenas uma vez, como a personalização da variável de ambiente $ PATH.

É bastante comum preencher ~/.Bash_profile apenas com linhas como abaixo dessa fonte o .Arquivo Bashrc. Isso significa que cada vez que você efetua login no terminal, o conteúdo da sua configuração local é lido.

se [-f ~//.Bashrc]; então
. ~/.Bashrc
fi

Se o arquivo ~//.Bash_profile existe, então Bash pulará a leitura de ~/.Bash_login (ou ~/.perfil).

~/.Bash_login

Os dois arquivos ~//.Bash_profile e ~//.Bash_login são análogos.

~/.perfil

A maioria das distribuições Linux está usando este arquivo em vez de ~/.Bash_profile. É usado para localizar o arquivo local .BashRC e para estender a variável $ PATH.

# se estiver executando a festa
se [-n "$ Bash_version"]; então
# incluir .Bashrc se existir
se [-f "$ home/.Bashrc "]; então
. "$ Home/.Bashrc "
fi
fi
# Defina o caminho para que inclua a lixeira privada do usuário se existir
se [-d "$ home/bin"]; então
Path = "$ Home/Bin: $ Path"
fi

Em geral, ~//.O perfil é lido por todas as conchas. Se ~///.Bash_profile ou ~/.Bash_login existe, Bash não lerá este arquivo.

/etc/bash.Bashrc e ~/.Bashrc

Este arquivo contém a configuração do Bash e lida com aliases locais, limites de história armazenados em .Bash_history (veja abaixo) e a conclusão do BASH.

# Não coloque linhas ou linhas duplicadas começando com o espaço na história.
# Veja Bash (1) para mais opções
HistControl = IgnoreBoth
# Anexe o arquivo de histórico, não o substitua
Shopt -s HISTAPPEND
# Para definir o comprimento do histórico, consulte Histsize e HistFilesize em Bash (1)
Histsize = 1000
Histfilesize = 2000

O que configurar em qual arquivo

Como você aprendeu até agora, não há um único arquivo, mas um grupo de arquivos para configurar o Bash. Esses arquivos existem apenas por razões históricas - especialmente a maneira como as diferentes conchas evoluíram e emprestaram recursos úteis um do outro. Além disso, não há regras rigorosas que

Defina qual arquivo deve manter uma certa parte da configuração. Essas são as recomendações que temos para você (com base no TLDP [10]):

  • Todas as configurações que você deseja aplicar a todos os ambientes de todos os seus usuários devem estar em /etc /perfil.
  • Todos os aliases e funções globais devem ser armazenados em /etc /Bashrc.
  • O arquivo ~///.Bash_profile é o arquivo de configuração preferido para configurar ambientes de usuário individualmente. Neste arquivo, os usuários podem adicionar opções de configuração extras ou alterar as configurações padrão.
  • Todos os aliases e funções locais devem ser armazenados em ~/.Bashrc.

Além disso, lembre -se de que o Linux foi projetado para ser muito flexível: se algum dos arquivos de inicialização nomeados acima não estiver presente no seu sistema, você poderá criá -lo.

Links e referências

  • [1] GNU Bash, https: // www.gnu.org/software/bash/
  • [2] Debian Almquist Shell (Dash), http: // gondor.Apana.org.Au/~ Herbert/Dash/
  • [3] ZSH, https: // www.Zsh.org/
  • [4] Certificação do Instituto Profissional do Linux (LPIC), Nível 1, https: // www.LPICE.UE/EN/Our Certificações/Lpic-1
  • [5] GRML, https: // grml.org/
  • [6] Diferencie o login interativo e a shell não interativa não-logina, Askubuntu, https: // Askubuntu.com/questões/879364/diferencia-interativa-login e não interativa não-login-shell
  • [7] Arquivos de inicialização Bash, https: // www.gnu.org/software/bash/manual/html_node/bash-startup-arquivos.HTML#Bash-Startup-Files
  • [8] The Shopt Buildin, https: // www.gnu.org/software/bash/manual/html_node/the-shopt-builtin.html
  • [9] UNIX Introdução - Bash Startup Arquivos de carregamento de ordem de carregamento, https: // médio.com/@youngstone89/unix-intodução-bash-startup-fille-carreging-encomend-562543ac12e9
  • [10] O Projeto de Documentação do Linux (TLDP), https: // tldp.org/ldp/bash-beginners-guide/html/sect_03_01.html

Obrigado

O autor gostaria de agradecer a Gerold Ruprecht por seu conselho enquanto escreve este artigo.