Executant Bash en detall

Si heu trobat aquesta pàgina en una cerca, probablement esteu intentant resoldre algun problema amb l'execució de bash.

Potser el vostre entorn bash no està configurant una variable d'entorn i no enteneu per què. És possible que hàgiu enganxat alguna cosa en diversos fitxers o perfils d'arrencada de bash o tots els fitxers a l'atzar fins que va funcionar.

En qualsevol cas, l'objectiu d'aquesta nota és establir el procediment per iniciar bash de la manera més senzilla possible perquè pugueu fer front als problemes.

Diagrama

Aquest diagrama de flux resumeix tots els processos en executar bash.

Executant Bash en detall

Ara fem una ullada més de prop a cada part.

Inicieu sessió a Shell?

Primer heu de triar si esteu a l'intèrpret d'ordres d'inici de sessió o no.

El shell d'inici de sessió és el primer shell que introduïu quan inicieu sessió per a una sessió interactiva. El shell d'inici de sessió no requereix un nom d'usuari i una contrasenya. Podeu forçar l'intèrpret d'ordres d'inici de sessió afegint una bandera --login en trucar bash, per exemple:

bash --inici de sessió

L'intèrpret d'ordres d'inici de sessió configura l'entorn base quan inicieu l'intèrpret d'ordres bash.

Interactiu?

A continuació, determineu si l'intèrpret d'ordres és interactiu o no.

Això es pot comprovar per la presència de la variable PS1 (instal·la la funció d'entrada d'ordres):

if [ "${PS1-}" ]; llavors echo interactive else echo no-interactive fi

O mira si l'opció està configurada -i, utilitzant una variable de guionet especial - a bash, per exemple:

$eco$-

Si hi ha un símbol a la sortida i, aleshores el shell és interactiu.

Al shell d'inici de sessió?

Si esteu en un shell d'inici de sessió, bash cerca el fitxer /etc/profile i s'executa si existeix.

A continuació, cerca qualsevol d'aquests tres fitxers en l'ordre següent:

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

Quan en troba un, l'engega i se salta els altres.

En un shell interactiu?

Si esteu en un shell no d'inici de sessió, se suposa que ja heu estat en un shell d'inici de sessió, l'entorn està configurat i s'heretarà.

En aquest cas, els dos fitxers següents s'executen en ordre, si n'hi ha:

/etc/bash.bashrc ~/.bashrc

Cap opció?

Si no esteu en un intèrpret d'ordres d'inici de sessió o en un intèrpret d'ordres interactiu, el vostre entorn estarà buit. Això provoca molta confusió (vegeu més avall sobre els treballs cron).

En aquest cas, bash mira la variable BASH_ENV el vostre entorn i crea el fitxer corresponent especificat allà.

Dificultats comuns i regles generals

feines cron

El 95% de les vegades que depuro l'inici de bash és perquè el treball cron no s'executa com s'esperava.

Aquesta maleïda tasca funciona bé quan ho executo a la línia d'ordres, però falla quan ho executo a crontab.

Aquí dues raons:

  • Les feines de Cron no són interactives.
  • A diferència dels scripts de línia d'ordres, els treballs cron no hereten l'entorn de l'intèrpret d'ordres.

Normalment no us adonareu ni us importarà que un script d'intèrpret d'ordres no sigui interactiu perquè l'entorn hereta de l'intèrpret d'ordres interactiu. Això vol dir que tot PATH и alias configurat com esperaries.

És per això que sovint és necessari establir un específic PATH per a una tasca cron com aquí:

* * * * * PATH=${PATH}:/path/to/my/program/folder myprogram

Guions que es criden mútuament

Un altre problema comú és quan els scripts estan configurats per error per trucar-se entre ells. Per exemple, /etc/profile apel·la a ~/.bashrc.

Això sol passar quan algú va intentar solucionar algun error i semblava que tot funcionava. Malauradament, quan necessiteu separar aquests diferents tipus de sessions, sorgeixen nous problemes.

Imatge de Docker amb zona de sorra

Per experimentar amb l'execució d'un shell, vaig crear una imatge de Docker que es pot utilitzar per depurar l'execució d'un shell en un entorn segur.

Llançament:

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

Es troba Dockerfile aquí.

Per forçar l'inici de sessió i simular un shell d'inici de sessió:

$ bash --login

Per provar un conjunt de variables BASH_ENV:

$ env | grep BASH_ENV

Per a la depuració crontab s'executarà un script senzill cada minut (en /root/ascript):

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

Font: www.habr.com

Afegeix comentari