Forståelse av bash shell -konfigurasjon ved oppstart

Forståelse av bash shell -konfigurasjon ved oppstart

I årevis har bashskallet [1] vært en integrert del av mange Linux -distribusjoner. I begynnelsen ble Bash valgt som det offisielle GNU-skallet fordi det var kjent, ganske stabilt og tilbød et anstendig sett med funksjoner.

I dag er situasjonen noe annerledes - bash er fremdeles til stede overalt som en programvarepakke, men har blitt erstattet av alternativer i standardinstallasjonen. Disse inkluderer for eksempel Debian Almquist Shell (Dash) [2] (for Debian Gnu/Linux) eller Zsh [3] (for GRML [5]). I de kjente distribusjonene Ubuntu, Fedora, Arch Linux og Linux Mint, har Bash så langt forblitt Standard Shell.

Det er ganske nyttig å forstå Bash -oppstart og å vite hvordan du konfigurerer dette riktig. Dette inkluderer tilpasning av skallmiljøet ditt, for eksempel å stille inn $ banevariabelen, justere utseendet til skallet og lage aliaser. Vi vil også se på de to filene .Bashrc og .bash_profile som leses ved oppstart. Den tilsvarende kunnskapen testes i eksamen 1 av Linux Professional Institute -sertifisering [4].

Sammenligning av et interaktivt innloggings- og ikke-interaktiv batch-skall

Generelt har et skall to driftsmåter. Det kan kjøres som et interaktivt påloggingsskall og som et ikke-interaktivt batchskall. Operasjonsmodusen definerer bashoppstarten og hvilke konfigurasjonsfiler som leses [7]. Operasjonsmodusen kan differensieres som følger [6]-interaktivt påloggingsskall, interaktivt ikke-login-skall, ikke-interaktivt påloggingsskall og ikke-interaktiv (batch) ikke-login-skall.

For å si det enkelt, leser et interaktivt skall og skriver til en brukers terminal. I kontrast er et ikke-interaktivt skall ikke assosiert med en terminal, som når du utfører et batch-skallskript. Et interaktivt skall kan være enten pålogging eller et ikke-loginskall.

Interaktiv innloggingsskall

Denne modusen refererer til å logge inn på datamaskinen din på en lokal maskin ved hjelp av en terminal som spenner fra TTY1 til TTY4 (avhenger av installasjonen din - det kan være mer eller mindre terminaler). Denne modusen dekker også eksternt logge på en datamaskin, for eksempel via et sikkert skall (SSH) som følger:

$ ssh user@fjernsystem
$ ssh user@ekstern-system fjernkommando

Den første kommandoen kobles til det eksterne systemet og åpner bare et interaktivt skall. Derimot kobler den andre kommandoen til det eksterne systemet, utfører den gitte kommandoen i et ikke-interaktivt påloggingsskall, og avslutter SSH-tilkoblingen. Eksemplet nedenfor viser dette mer detaljert:

$ ssh localhost oppetid
Bruker@localhosts passord:
11:58:49 opp 23 dager, 11:41, 6 brukere, belastningsgjennomsnitt: 0,10, 0,14, 0,20
$

For å finne ut om du er logget inn på datamaskinen din ved å bruke et påloggingsskall, skriver du inn følgende Echo -kommando i terminalen din:

$ ekko $ 0
-bash
$

For et påloggingsskall starter utgangen med en "-" etterfulgt av navnet på skallet, noe som resulterer i "-bash" i vårt tilfelle. For et ikke-loginskall er utgangen bare navnet på skallet. Eksemplet nedenfor viser dette for de to kommandoene ekko $ 0, og oppetid er gitt til SSH som en strengparameter:

$ ssh localhost "ekko $ 0; oppetid"
Bruker@localhosts passord:
bash
11:58:49 opp 23 dager, 11:41, 6 brukere, belastningsgjennomsnitt: 0,10, 0,14, 0,20
$

Som et alternativ, bruk den innebygde Shopt-kommandoen [8] som følger:

$ Shopt Login_shell
Login_shell av
$

For et ikke-loginskall returnerer kommandoen "av", og for et påloggingsskall, "ON".

Når det gjelder konfigurasjonen for denne typen skall, tas tre filer med i betraktningen. Disse er/etc/profil, ~/.profil, og ~/.bash_profile. Se nedenfor for en detaljert beskrivelse av disse filene.

Interaktiv ikke-loginskall

Denne modusen beskriver åpning av en ny terminal, for eksempel XTERM- eller GNOME -terminal, og utfører et skall i den. I denne modusen er de to filene/etc/Bashrc og ~/.Bashrc leses. Se nedenfor for en detaljert beskrivelse av disse filene.

Ikke-interaktiv ikke-loginskall

Denne modusen er i bruk når du utfører et skallskript. Skallskriptet kjører i sitt eget underskall. Det er klassifisert som ikke-interaktiv med mindre den ber om brukerinngang. Skallet åpnes bare for å utføre skriptet og lukker det umiddelbart når skriptet er avsluttet.

./Lokal-Script.sh

Ikke-interaktiv innloggingsskall

Denne modusen dekker logging på en datamaskin fra en fjernkontroll, for eksempel via Secure Shell (SSH). Shell-skriptet Lokal-Script.SH kjøres lokalt, først, og utgangen brukes som inngang av SSH.

./Lokal-Script.sh | SSH User@Remote-System

Å starte SSH uten ytterligere kommando starter et påloggingsskall på det eksterne systemet. I tilfelle inngangsenheten (STDIN) til SSH ikke er terminal, starter SSH et ikke-interaktivt skall og tolker utgangen fra skriptet som kommandoer som skal utføres på det eksterne systemet. Eksemplet nedenfor kjører oppetidskommandoen på det eksterne systemet:

$ ECHO "UPTIME" | ssh localhost
Pseudo-terminal vil ikke bli tildelt fordi stdin ikke er en terminal.
Frank@localhosts passord:
Programmene som er inkludert i Debian GNU/Linux -systemet er gratis programvare;
De nøyaktige distribusjonsbetingelsene for hvert program er beskrevet i
Individuelle filer i/usr/share/doc/*/copyright.
Debian Gnu/Linux kommer med absolutt ingen garanti, i den grad
tillatt i gjeldende lov.
Du har ny post.
11:58:49 opp 23 dager, 11:41, 6 brukere, belastningsgjennomsnitt: 0,10, 0,14, 0,20
$

Interessant nok klager SSH over at STDIN ikke er en terminal og viser dagens melding (MOTD) som er lagret i den globale konfigurasjonsfilen /etc /MOTD. For å forkorte terminalutgangen, legg til "SH" -alternativet som en parameter for SSH -kommandoen, som vist nedenfor. Resultatet er at et skall åpnes først, og de to kommandoene kjøres uten å vise MOTD, først.

$ ECHO "UPTIME" | ssh localhost sh
Frank@localhosts passord:
12:03:39 opp 23 dager, 11:46, 6 brukere, belastningsgjennomsnitt: 0,07, 0,09, 0,16
$$

Deretter vil vi se på de forskjellige konfigurasjonsfilene for bash.

Bash oppstartsfiler

De forskjellige bash -modusene som definerer hvilke konfigurasjonsfiler som leses ved oppstart:

  • Interaktiv innloggingsskall
    • /etc/profil: Hvis den eksisterer, kjører den kommandoene som er oppført i filen.
    • ~/.bash_profile, ~/.bash_login, og ~/.profil (i den rekkefølgen). Den utfører kommandoene fra den første lesbare filen som ble funnet fra listen. Hver enkelt bruker kan ha sitt eget sett med disse filene.
  • Interaktiv ikke-loginskall
    • /etc/bash.Bashrc: Global bash -konfigurasjon. Den utfører kommandoene hvis den filen eksisterer, og den er lesbar. Bare tilgjengelig i Debian Gnu/Linux, Ubuntu og Arch Linux.
    • ~/.Bashrc: Lokal bash -konfigurasjon. Den utfører kommandoene hvis den filen eksisterer, og den er lesbar.

Det kan være nyttig å se dette som en graf. Under forskningen fant vi bildet nedenfor, som vi liker veldig godt [9].


bilde: Config-Path.png
tekst: Evalueringsprosess for bash -konfigurasjon

De forskjellige konfigurasjonsfilene forklarte

For filene som er forklart nedenfor, er det ingen generelle regelsett for hvilket alternativ du skal lagre i hvilken fil (bortsett fra globale alternativer vs. lokale alternativer). Videre er rekkefølgen konfigurasjonsfilene leses designet med fleksibilitet i tankene, slik at en endring av skallet du bruker sikrer at du fremdeles kan bruke Linux -systemet. Derfor er flere filer i bruk som konfigurerer det samme.

/etc/profil

Denne filen brukes av Bourne Shell (SH) samt Bourne -kompatible skjell som Bash, Ash og Ksh. Den inneholder standardoppføringene for miljøvariablene for alle brukere som logger inn interaktivt. For eksempel påvirker dette $ banen og den raske designen for vanlige brukere, så vel som brukeren som heter "root". Eksemplet nedenfor viser en del av/etc/profil fra Debian Gnu/Linux.

setUserPath ()
# Vanlige kataloger til kjørbare filer for alle brukere
Path = "/usr/local/bin:/usr/bin:/bin"
# Test for rotbruker å legge til for systemadministrasjonsprogrammer
hvis ["'id -u'" -eq 0]; deretter
Path = "/usr/local/sbin:/usr/sbin:/sbin: $ path"
ellers
Path = "/usr/local/games:/usr/games: $ path"
fi
Eksportvei

setUserPath ()
# PS1 er den primære ledetekststrengen
hvis ["$ ps1"]; deretter
if ["$ bash"] && ["$ bash" != "/bin/sh"]; deretter
# Filbasen.Bashrc angir allerede standard PS1.
# Ps1 = "\ h: \ w \ $"
hvis [-f /etc /bash.Bashrc]; deretter
. /etc/bash.Bashrc
fi
ellers
hvis ["'id -u'" -eq 0]; deretter
Ps1 = '#'
ellers
PS1 = '$'
fi
fi
fi

Ytterligere konfigurasjonsfiler kan lagres i katalogen /etc /profil.d. De er hentet inn i bash -konfigurasjonen så snart /etc /profil er lest.

~/.bash_profile

Denne lokale konfigurasjonsfilen blir lest og utført når bash påberopes som et interaktivt påloggingsskall. Den inneholder kommandoer som bare skal kjøres en gang, for eksempel å tilpasse $ bane miljøvariable.

Det er ganske vanlig å fylle ~/.bash_profile bare med linjer som under den kilden .Bashrc -fil. Dette betyr at hver gang du logger deg på terminalen, leses innholdet i din lokale bash -konfigurasjon.

hvis [-f ~/.Bashrc]; deretter
. ~/.Bashrc
fi

Hvis filen ~/.bash_profile eksisterer, så vil bash hoppe over lesing fra ~/.bash_login (eller ~/.profil).

~/.BASH_LOGIN

De to filene ~/.bash_profile og ~/.Bash_login er analoge.

~/.profil

De fleste Linux -distribusjoner bruker denne filen i stedet for ~/.bash_profile. Den brukes til å lokalisere den lokale filen .Bashrc og for å utvide $ banevariabelen.

# Hvis du kjører bash
hvis [-n "$ bash_version"]; deretter
# inkluderer .Bashrc hvis det eksisterer
hvis [-f "$ hjem/.Bashrc "]; da
. "$ Hjem/.Bashrc "
fi
fi
# sett banen slik at den inkluderer brukerens private søppel hvis den eksisterer
if [-d "$ home/bin"]; deretter
Path = "$ Hjem/bin: $ bane"
fi

Generelt, ~/.Profilen leses av alle skjell. Hvis enten ~/.bash_profile eller ~/.bash_login eksisterer, Bash vil ikke lese denne filen.

/etc/bash.Bashrc og ~/.Bashrc

Denne filen inneholder bash -konfigurasjonen og håndterer lokale aliaser, historiegrenser som er lagret i .bash_history (se nedenfor), og fullføring av bash.

# Ikke legg dupliserte linjer eller linjer som starter med plass i historien.
# Se bash (1) for flere alternativer
HistControl = Ignoreboth
# Legg til historiefilen, ikke overskrive den
Shopt -s histappend
# For å sette historiens lengde, se Histsize og histfilesize i bash (1)
HistSize = 1000
Histfilesize = 2000

Hva du skal konfigurere i hvilken fil

Som du har lært så langt, er det ikke en eneste fil, men en gruppe filer for å konfigurere bash. Disse filene eksisterer bare av historiske grunner - spesielt måten de forskjellige skjellene utviklet seg og lånte nyttige funksjoner fra hverandre. Det er heller ingen strenge regler kjent

Definer hvilken fil som er ment for å oppbevare en viss del av oppsettet. Dette er anbefalingene vi har for deg (basert på TLDP [10]):

  • Alle innstillinger du vil bruke på alle brukernes miljøer, skal være i /etc /profil.
  • Alle globale aliaser og funksjoner skal lagres i /etc /Bashrc.
  • Filen ~/.bash_profile er den foretrukne konfigurasjonsfilen for å konfigurere brukermiljøer individuelt. I denne filen kan brukere legge til ekstra konfigurasjonsalternativer eller endre standardinnstillinger.
  • Alle lokale aliaser og funksjoner skal lagres i ~/.Bashrc.

Husk også at Linux er designet for å være veldig fleksibel: Hvis noen av oppstartsfilene nevnt ovenfor ikke er til stede på systemet ditt, kan du opprette det.

Lenker og referanser

  • [1] GNU Bash, https: // www.gnu.org/programvare/bash/
  • [2] Debian Almquist Shell (Dash), http: // gondor.Apana.org.AU/~ Herbert/Dash/
  • [3] Zsh, https: // www.zsh.org/
  • [4] Linux Professional Institute Certification (LPIC), nivå 1, https: // www.lpice.EU/EN/Our Sertifications/LPIC-1
  • [5] GRML, https: // grml.org/
  • [6] Differensiere interaktiv innlogging og ikke-interaktiv ikke-loginskall, Askubuntu, https: // askubuntu.com/spørsmål/879364/differensierende-interaktiv-login-og-ikke-interaktiv-ikke-login-skall
  • [7] Bash oppstartsfiler, https: // www.gnu.org/programvare/bash/manuell/html_node/bash-startup-files.HTML#BASH-STARTUP-FILES
  • [8] The Shopt Builtin, https: // www.gnu.org/programvare/bash/manuell/html_node/the-shopt-Builtin.html
  • [9] UNIX Introduksjon - Bash Startup Files Loading Order, Https: // Medium.COM/@Youngstone89/UNIX-INTRODUCTION-BASH-STARTUP-FILES-LOADING-ORORD-562543AC12E9
  • [10] Linux Documentation Project (TLDP), https: // TLDP.ORG/LDP/BASH-BEGINNERS-Guide/HTML/SECT_03_01.html

Takk skal du ha

Forfatteren vil takke Gerold Rupprecht for hans råd mens han skrev denne artikkelen.