Execución de Bash en detalle

Se atopaches esta páxina nunha busca, probablemente esteas tentando resolver algún problema coa execución de bash.

Quizais o teu ambiente bash non estea configurando unha variable de ambiente e non entendes por que. É posible que teña metido algo en varios ficheiros ou perfís de arranque de bash ou en todos os ficheiros ao chou ata que funcionou.

En calquera caso, o obxectivo desta nota é establecer o procedemento para iniciar bash o máis sinxelo posible para que poidas xestionar os problemas.

Diagrama

Este diagrama de fluxo resume todos os procesos ao executar bash.

Execución de Bash en detalle

Agora vexamos cada parte con máis detalle.

Iniciar sesión en Shell?

Primeiro debes escoller se estás no shell de inicio de sesión ou non.

O shell de inicio de sesión é o primeiro shell que ingresa cando inicia sesión nunha sesión interactiva. O shell de inicio de sesión non require un nome de usuario e un contrasinal. Podes forzar o shell de inicio de sesión engadindo unha bandeira --login cando se chama bash, por exemplo:

bash --iniciar sesión

O shell de inicio de sesión configura o ambiente base cando inicia o shell bash.

Interactiva?

Despois determinas se o shell é interactivo ou non.

Isto pódese comprobar pola presenza da variable PS1 (instala a función de entrada de comandos):

if [ "${PS1-}" ]; entón echo interactivo senón echo non interactivo fi

Ou mira se a opción está configurada -i, usando unha variable de guión especial - en bash, por exemplo:

$eco$-

Se hai un símbolo na saída i, entón o shell é interactivo.

No shell de inicio de sesión?

Se estás nun shell de inicio de sesión, bash busca o ficheiro /etc/profile e corre se existe.

Despois busca calquera destes tres ficheiros na seguinte orde:

~/.bash_profile ~/.bash_login ~/.profile

Cando atopa un, iníciao e salta os outros.

Nun shell interactivo?

Se estás nun shell non de inicio de sesión, suponse que xa estivo nun shell de inicio de sesión, o ambiente está configurado e herdarase.

Neste caso, os dous ficheiros seguintes execútanse por orde, se os hai:

/etc/bash.bashrc ~/.bashrc

Sen opción?

Se non estás nun shell de inicio de sesión ou nun shell interactivo, o teu ambiente estará baleiro. Isto causa moita confusión (ver máis abaixo sobre os traballos cron).

Neste caso, bash mira a variable BASH_ENV o seu entorno e crea o ficheiro correspondente especificado alí.

Dificultades comúns e regras xerais

traballos cron

O 95% das veces que depuro o inicio de bash é porque o traballo cron non se está a executar como se esperaba.

Esta maldita tarefa funciona ben cando o executo na liña de comandos, pero falla cando o executo en crontab.

Aquí dúas razóns:

  • Os traballos de Cron non son interactivos.
  • A diferenza dos scripts de liña de comandos, os traballos cron non herdan o ambiente de shell.

Normalmente non notará nin lle importará que un script de shell non sexa interactivo porque o ambiente herda do shell interactivo. Isto significa que todo PATH и alias configurado como cabría esperar.

É por iso que moitas veces é necesario establecer un específico PATH para unha tarefa cron como aquí:

* * * * * PATH=${PATH}:/ruta/a/meu/programa/cartafol o meu programa

Guións que se chaman entre si

Outro problema común é cando os scripts están configurados por erro para chamarse entre si. Por exemplo, /etc/profile apela a ~/.bashrc.

Isto adoita ocorrer cando alguén intentou corrixir algún erro e todo parecía funcionar. Desafortunadamente, cando precisa separar estes diferentes tipos de sesións, xorden novos problemas.

Imaxe de Docker con area de area

Para experimentar coa execución dun shell, creei unha imaxe de Docker que se pode usar para depurar a execución dun shell nun ambiente seguro.

Lanzamento:

$ docker run -n bs -d imiell/bash_startup
$ docker exec -ti bs bash

Dockerfile está situado aquí.

Para forzar o inicio de sesión e simular un shell de inicio de sesión:

$ bash --login

Para probar un conxunto de variables BASH_ENV:

$ env | grep BASH_ENV

Para depuración crontab un script sinxelo executarase cada minuto (en /root/ascript):

$ crontab -l
$ cat /var/log/script.log

Fonte: www.habr.com

Engadir un comentario